是否有理由保留.cmo或仅.cma?

时间:2011-12-25 17:17:30

标签: ocaml

说,我有mylibrary.mllibrary.c提供包装,我想进行字节码编译并提供mylibrary.ml作为其他ocaml代码的库。将其编译为字节码(我不考虑在这里将ocaml编译为本机代码)会生成许多文件,我想知道是否有任何理由将它们全部保留下来?或者将它们全部提供给图书馆的其他用户?

我(到目前为止)明白我需要字节码库对象mylibrary.cma,以便我可以在ocaml中使用mylibrary toplevel as

ocaml mylibrary.cma

或者我可以

#load "mylibrary.cma";;
来自ocaml脚本。然后,编译接口mylibrary.cmidllmylibrary.so(包含代码的C部分)也需要上面的工作。并且非编译接口定义文件mylibrary.mli很适合用于文档目的。

但如果我有mylibrary.cmo文件,是否还有理由保留mylibrary.cma文件?在某种情况下,有人也喜欢这样吗?

编辑:我的意思是,我需要在makefile中构造.cmo,然后使用它构建.cma,但我想在此之后删除.cmo,以保持目录略微清洁。

2 个答案:

答案 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.cmidlllibrary.so):

#load "mylibrary.cma";;

OR

可以编译一个字节码程序,该程序与mylibrary.cmamylibrary.cmidlllibrary.so也需要动态链接):

ocamlc mylibrary.cma <program>.ml

OR

动态链接字节码对象,而不是字节码库(所需文件:mylibrary.cmomylibrary.cmidlllibrary.so):

ocamlc dlllibrary.so mylibrary.cmo <program>.ml

(注意:然后运行字节码:ocamlrun -I . <program>,假设dlllibrary.so在当前目录中。)

OR

静态链接对象(所需文件:mylibrary.cmomylibrary.cmi liblibrary.a

ocamlc -custom liblibrary.a mylibrary.cmo <program>.ml

OR

静态链接库对象(需要的文件:mylibrary.cmamylibrary.cmiliblibrary.a

ocamlc -custom -I . mylibrary.cma <program>.ml

因此,根据将来如何使用该库,需要不同的文件。除了.mli只有人类读者才需要,并且不需要从C库编译的目标文件.o(但在某些情况下编译为本机代码时需要它)。

答案 1 :(得分:2)

您甚至应该保留库的源代码。通常在升级Ocaml编译器时(例如从3.12升级到将来的3.13),如果没有重新编译,以前的*.cmo*.cma文件将无法工作。

假设您可以随时清理和重新编译内容(例如,您有两个传统目标cleanallmake),您只能保留*.cma