说,我有mylibrary.ml
为library.c
提供包装,我想进行字节码编译并提供mylibrary.ml
作为其他ocaml代码的库。将其编译为字节码(我不考虑在这里将ocaml编译为本机代码)会生成许多文件,我想知道是否有任何理由将它们全部保留下来?或者将它们全部提供给图书馆的其他用户?
我(到目前为止)明白我需要字节码库对象mylibrary.cma
,以便我可以在ocaml中使用mylibrary toplevel as
ocaml mylibrary.cma
或者我可以
#load "mylibrary.cma";;
mylibrary.cmi
和dllmylibrary.so
(包含代码的C部分)也需要上面的工作。并且非编译接口定义文件mylibrary.mli
很适合用于文档目的。
但如果我有mylibrary.cmo
文件,是否还有理由保留mylibrary.cma
文件?在某种情况下,有人也喜欢这样吗?
.cmo
,然后使用它构建.cma
,但我想在此之后删除.cmo
,以保持目录略微清洁。
答案 0 :(得分:4)
所以,显然不同文件的目的是(当将其限制为字节码编译器时):
mylibrary.mli
- 人类可读的接口定义(不严格需要,编译器只需要.cmi)
mylibrary.cmi
- 编译调用mylibrary的代码时需要编译的接口
library.o
- C对象文件
dlllibrary.so
- 由.o
组成的共享库对象
dlllibrary.a
- 由.o
组成的静态库对象
mylibrary.cmo
- 从mylibrary.ml
编译的字节码对象
mylibrary.cma
- 字节码库
然后,从顶层加载mylibrary时需要mylibrary.cma
(带mylibrary.cmi
和dlllibrary.so
):
#load "mylibrary.cma";;
OR
可以编译一个字节码程序,该程序与mylibrary.cma
(mylibrary.cmi
和dlllibrary.so
也需要动态链接):
ocamlc mylibrary.cma <program>.ml
OR
动态链接字节码对象,而不是字节码库(所需文件:mylibrary.cmo
,mylibrary.cmi
,dlllibrary.so
):
ocamlc dlllibrary.so mylibrary.cmo <program>.ml
(注意:然后运行字节码:ocamlrun -I . <program>
,假设dlllibrary.so
在当前目录中。)
OR
静态链接对象(所需文件:mylibrary.cmo
,mylibrary.cmi
liblibrary.a
)
ocamlc -custom liblibrary.a mylibrary.cmo <program>.ml
OR
静态链接库对象(需要的文件:mylibrary.cma
,mylibrary.cmi
,liblibrary.a
)
ocamlc -custom -I . mylibrary.cma <program>.ml
因此,根据将来如何使用该库,需要不同的文件。除了.mli
只有人类读者才需要,并且不需要从C库编译的目标文件.o
(但在某些情况下编译为本机代码时需要它)。
答案 1 :(得分:2)
您甚至应该保留库的源代码。通常在升级Ocaml编译器时(例如从3.12升级到将来的3.13),如果没有重新编译,以前的*.cmo
或*.cma
文件将无法工作。
假设您可以随时清理和重新编译内容(例如,您有两个传统目标clean
和all
到make
),您只能保留*.cma