什么是这些* .cm [a-z]文件以及何时需要它们

时间:2014-08-21 09:17:11

标签: ocaml

OCaml对已编译文件有各种扩展:*.a*.cma*.cmi*.cmx*.cmxa*.cmxs(也许, ,这不是详尽的清单)。它们是什么,在哪些情况下我需要它们?

如果我有一个库,我需要随附哪些文件。我注意到有些人盲目地将所有* .cm [a-z]文件安装到存档中,但这是否真的需要?

2 个答案:

答案 0 :(得分:6)

首先,我建议您阅读byte codenative code编译器的概述部分,因为这将极大地提高您对这些文件的理解。

现在更具体地说,如果您的库是一组以.mli / .ml个文件为特征的模块:

  • 一个cmi文件保存模块的编译接口(编译.mli文件的结果)。对于您希望其他人能够使用的库的每个模块,您需要安装它们(即cmi定义您的公共接口)。安装mli文件也是一种很好的做法,以便人们可以查看它们。这些天您还应该安装cmti文件(使用-bin-annot选项生成),这些文件是带注释的编译接口,可以由ocp-indexodoc和{{}等工具使用1}}。

  • odig个文件包含库的字节码comipilation(cma文件)结果的存档。如果您希望人们能够使用库编译为字节代码,则应安装它们。

  • cmocmxa个文件包含您的库的本机代码编译(.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)