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。