Ocaml 是否有保留.cmo或仅保留.cma的理由?
比如说,我有Ocaml 是否有保留.cmo或仅保留.cma的理由?,ocaml,Ocaml,比如说,我有mylibrary.ml,它为library.c提供包装,我想用字节码编译并提供mylibrary.ml作为其他ocaml代码的库。将其编译为字节码(我不考虑在这里将ocaml编译为本机代码)会产生许多文件,我想知道是否有任何理由保留它们?还是将它们全部提供给图书馆的其他用户 我(到目前为止)知道我需要字节码库对象mylibrary.cma,这样我就可以在ocaml顶级中使用mylibrary了 ocaml mylibrary.cma 或者我可以 #load "mylibrary.
mylibrary.ml
,它为library.c
提供包装,我想用字节码编译并提供mylibrary.ml
作为其他ocaml代码的库。将其编译为字节码(我不考虑在这里将ocaml编译为本机代码)会产生许多文件,我想知道是否有任何理由保留它们?还是将它们全部提供给图书馆的其他用户
我(到目前为止)知道我需要字节码库对象mylibrary.cma
,这样我就可以在ocaml顶级中使用mylibrary了
ocaml mylibrary.cma
或者我可以
#load "mylibrary.cma";;
从一个ocaml脚本。然后还需要编译接口mylibrary.cmi
,以及dllmyllibrary.so
(其中包含代码的C部分)才能使上述功能正常工作。非编译接口定义文件mylibrary.mli
很好地保存起来,用于文档编制
但是如果我有mylibrary.cma
文件,有什么理由保留mylibrary.cmo
文件吗?在什么样的情况下,有人也希望这样
编辑:我的意思是,我需要在makefile中构造
.cmo
,然后用它来构造.cma
,但我想在此之后删除.cmo
,以保持目录稍微干净。你甚至应该保留库的源代码。通常在升级Ocaml编译器时(例如从3.12升级到未来的3.13),您以前的*.cmo
或*.cma
文件如果不重新编译将无法工作
假设您总是可以清理和重新编译东西(例如,您有两个传统的目标
clean
和all
来make
),那么您只能保留*.cma
,显然不同文件的用途是(将其限制为字节码编译器时):
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
):
#加载“mylibrary.cma”代码>
或
可以编译一个字节码程序,动态链接到mylibrary.cma
(mylibrary.cmi
和dlllibrary.so
):
ocamlc mylibrary.cma.ml
或
动态链接字节码对象,而不是字节码库(所需文件:mylibrary.cmo
,mylibrary.cmi
,dlllibrary.so
):
ocamlc dlllibrary.so mylibrary.cmo.ml
(注意:然后使用:ocamlrun-I.
运行字节码,假设dlllibrary.so
在当前目录中。)
或
与对象静态链接(所需文件:mylibrary.cmo
,mylibrary.cmi
liblibrary.a
)
ocamlc-自定义liblibrary.a mylibrary.cmo.ml
或
静态链接库对象(所需文件:mylibrary.cma
,mylibrary.cmi
,liblibrary.a
)
ocamlc-custom-I。mylibrary.cma.ml
因此,根据将来如何使用库,需要不同的文件。除此之外,.mli
仅用于人类读者,不需要从C库编译的对象文件.o
(但在某些情况下编译为本机代码时需要)。是的,当然我会保留源代码。我在想,是否有人愿意使用.cmo而不是.cma。