OCaml对已编译文件有各种扩展:*.a
,*.cma
,*.cmi
,*.cmx
,*.cmxa
,*.cmxs
(也许, ,这不是详尽的清单)。它们是什么,在哪些情况下我需要它们?
如果我有一个库,我需要随附哪些文件。我注意到有些人盲目地将所有* .cm [a-z]文件安装到存档中,但这是否真的需要?
答案 0 :(得分:6)
首先,我建议您阅读byte code和native code编译器的概述部分,因为这将极大地提高您对这些文件的理解。
现在更具体地说,如果您的库是一组以.mli
/ .ml
个文件为特征的模块:
一个cmi
文件保存模块的编译接口(编译.mli
文件的结果)。对于您希望其他人能够使用的库的每个模块,您需要安装它们(即cmi
定义您的公共接口)。安装mli
文件也是一种很好的做法,以便人们可以查看它们。这些天您还应该安装cmti
文件(使用-bin-annot
选项生成),这些文件是带注释的编译接口,可以由ocp-index
,odoc
和{{}等工具使用1}}。
odig
个文件包含库的字节码comipilation(cma
文件)结果的存档。如果您希望人们能够使用库编译为字节代码,则应安装它们。
cmo
和cmxa
个文件包含您的库的本机代码编译(.a
/ cmx
文件)结果的存档。它们是o
文件的下垂,但是对于本机代码。如果您希望人们能够使用您的库编译为本机代码,则需要安装它们。cma
是本地dynlinking cmxas
的链接。如果您希望库的用户能够使用cmxa
模块将库作为插件动态加载到您的程序中,则需要安装它们。Dynlink
文件位于cmx
但是您可能还想安装它们的原因之一。如果可以在单独的编译时间以及cmxa
文件中看到它们,则它们允许编译器执行跨模块内联。然而,以这种方式单独编译的文件确实依赖于该实现,这意味着即使cmi
(即接口)没有,cmx
更改(即实现)也需要重新编译。 请注意,一般情况下,如果您能够编译并安装所有这些文件,那将是很好的(尽管有时由于某些原因您可能不想安装{{ 1}}文件,以便您可以针对(如果需要,请参阅cmi
单独编译并能够在不重新编译的情况下切换实现cmx
编译标记)。
最后需要注意的是,在OCaml中没有正确的名称空间:每个顶层模块都在全局命名空间中定义。这意味着您需要非常小心放入库中的顶级模块名称,即使您没有导出他们的cmi 。特别要避免其他库可以使用的通用术语,为您的库使用简短的前缀,例如cmi
而不是-opaque
(即使MyLib_file
原来是File
中的内部模块,但File
你没有cma
。导出它可能会与其他库中定义的其他私有或公共cmi
模块发生冲突)
答案 1 :(得分:1)