OCaml中有编译的文件不同的扩展:*.a,*.cma,*.cmi,*.cmx,*.cmxa,*.cmxs(也许,这并不是详尽的列表).它们是什么,在哪些情况下我需要它们?
如果我有一个库,我需要随附哪些文件.我注意到有些人盲目地将所有*.cm [az]文件安装到存档中,但是它真的需要吗?
首先,我建议您阅读字节代码和本机代码编译器的概述部分,因为这将极大地提高您对这些文件的理解.
现在更具体地说,如果您的库是一组以.mli/ .ml文件为特征的模块:
一个cmi文件保存模块的编译接口(编译.mli文件的结果).对于您希望其他人能够使用的库的每个模块,您需要安装它们(即cmi定义您的公共接口).安装mli文件也是一种很好的做法,这样人们就可以偷看它们.这些日子里,你还应该安装cmti文件(使用生成的-bin-annot这些注释编译接口,可以通过类似的工具可以使用选件)ocp-index,odoc和odig.
cmafiles保存库的字节代码comipilation(cmo文件)结果的存档.如果您希望人们能够使用库编译为字节代码,则应安装它们.
cmxa和.a文件包含库的本机代码编译(cmx/ o文件)结果的存档.它们是cma文件的下垂,但是对于本机代码.如果您希望人们能够使用您的库编译为本机代码,则需要安装它们.cmxas是cmxa原生dynlinking 的吊坠.如果您希望库的用户能够使用该Dynlink模块将库作为插件动态加载到程序中,则需要安装它们.cmx文件位于cmxa然而,有一个原因,你可能也想安装它们.如果可以在单独的编译时间和cmi文件中看到它们,则允许编译器执行跨模块内联.然而,以这种方式单独编译的文件确实依赖于该实现,这意味着cmx即使cmi(即接口)没有改变(即实现),它们也需要重新编译.请注意,一般情况下,如果您能够编译和安装所有这些文件,这是很好的(尽管有时由于某些原因您可能不希望安装(cmx文件,以便您可以单独编译cmi并能够在不重新编译的情况下切换实现)-opaque如果需要,请参阅编译标志).
最后需要注意的是,在OCaml中没有正确的名称空间:每个顶层模块都在全局命名空间中定义.这意味着您需要非常小心放入库中的顶层模块名称,即使您不导出它们的cmi.尤其是避免任何可能被其他库一起使用的通用术语,用很短的前缀是你的库如MyLib_file,而File如果(并且再次甚至File原来是你在有一个内部的模块,cma但其cmi不出口可能与其他冲突File其他库中定义的私有或公共模块)