比方说,我有为library.c提供包装的mylibrary.ml,我想进行字节码编译,并将mylibrary.ml作为库提供给其他ocaml代码。将其编译成字节码(我在这里不考虑将ocaml编译成本机代码)会产生许多文件,我想知道是否有任何理由保留所有这些文件?或者将它们全部提供给库的其他用户?
我(到目前为止)知道我需要字节码库对象mylibrary.cma,这样我就可以在ocaml toplevel中使用mylibrary
ocaml mylibrary.cma或者我可以
#load "mylibrary.cma";;从ocaml脚本。然后还需要编译的接口mylibrary.cmi和dllmylibrary.so (包含代码的C部分)才能运行上面的代码。未编译的接口定义文件mylibrary.mli很容易保存,以便进行文档记录。
但是,如果我有mylibrary.cma文件,还有什么理由还要保留mylibrary.cmo文件吗?在什么样的情况下,有人也想拥有它呢?
编辑:我的意思是,我需要在makefile中构造.cmo,然后用它来构造.cma,但我想在这之后删除.cmo,以保持目录的边际整洁。
发布于 2012-03-26 23:35:39
因此,很明显,不同文件的目的是(仅限于字节码编译器):
mylibrary.mli -人类可读的接口定义(不是严格需要的,编译器只需要.cmi)
mylibrary.cmi编译接口,编译调用mylibrary的代码时需要
library.o -C目标文件
由.o组成的dlllibrary.so共享库对象
dlllibrary.a -由.o组成的静态库对象
mylibrary.cmo -从mylibrary.ml编译的字节码对象
mylibrary.cma -字节码库
然后,当从顶层加载mylibrary时,需要mylibrary.cma (带有mylibrary.cmi和dlllibrary.so):
#load "mylibrary.cma";;
或
可以编译一个动态链接到mylibrary.cma的字节码程序(还需要mylibrary.cmi和dlllibrary.so ):
ocamlc mylibrary.cma <program>.ml
或
动态链接字节码对象,而不是字节码库(需要的文件:mylibrary.cmo、mylibrary.cmi、dlllibrary.so):
ocamlc dlllibrary.so mylibrary.cmo <program>.ml
(注意:假设dlllibrary.so在当前目录中,则使用:ocamlrun -I . <program>运行字节码。)
或
与对象静态链接(所需文件:mylibrary.cmo、mylibrary.cmi liblibrary.a)
ocamlc -custom liblibrary.a mylibrary.cmo <program>.ml
或
与库对象静态链接(所需文件:mylibrary.cma、mylibrary.cmi、liblibrary.a)
ocamlc -custom -I . mylibrary.cma <program>.ml
因此,根据将来如何使用库,需要不同的文件。除了只有人类读者需要.mli,而不需要从C库编译的目标文件.o(但在某些情况下编译为本机代码时需要)。
发布于 2011-12-26 01:20:23
你甚至应该保留这个库的源代码。在升级Ocaml编译器(例如从3.12升级到未来的3.13)时,如果不重新编译,以前的*.cmo或*.cma文件将无法工作。
假设你总是可以清理和重新编译东西(例如,你有两个传统的目标clean和all to make),你只能保留*.cma
https://stackoverflow.com/questions/8630599
复制相似问题