Ocaml 这些*.cm[a-z]文件是什么?我们什么时候需要它们
OCaml有各种编译文件扩展名:Ocaml 这些*.cm[a-z]文件是什么?我们什么时候需要它们,ocaml,Ocaml,OCaml有各种编译文件扩展名:*.a,*.cma,*.cmi,*.cmx,*.cmxa,*.cmxs(这可能不是详尽的列表)。它们是什么?在哪些情况下我需要它们 如果我有一个库,我需要附带哪些文件。我注意到有些人盲目地将所有的*.cm[a-z]文件安装到存档中,但这真的是必需的吗?是一个很好的资源,你可以阅读它来回答你的问题 总结如下: 首先,我建议您阅读和编译器的概述部分,因为这将大大提高您对这些文件的理解 现在更具体地说,如果您的库是一组模块,由一组.mli/.ml文件表示: cmi文件
*.a
,*.cma
,*.cmi
,*.cmx
,*.cmxa
,*.cmxs
(这可能不是详尽的列表)。它们是什么?在哪些情况下我需要它们
如果我有一个库,我需要附带哪些文件。我注意到有些人盲目地将所有的*.cm[a-z]文件安装到存档中,但这真的是必需的吗?是一个很好的资源,你可以阅读它来回答你的问题
总结如下:
首先,我建议您阅读和编译器的概述部分,因为这将大大提高您对这些文件的理解 现在更具体地说,如果您的库是一组模块,由一组
.mli
/.ml
文件表示:
文件保存模块的已编译接口(编译cmi
文件的结果)。对于您希望其他人能够使用的库的每个模块,您需要安装它们(即.mli
定义您的公共界面)。安装cmi
文件也是一种很好的做法,这样人们就可以看到它们。现在,您还应该安装mli
文件(使用cmti
选项生成),这些文件是带注释的编译接口,可由-bin annot
、ocp index
和odoc
等工具使用odig
文件保存库中字节码编译结果的存档(cma
文件)。如果您希望人们能够使用您的库编译到字节码,那么应该安装它们cmo
和cmxa
文件保存库的本机代码编译结果(.a
/cmx
文件)的存档。它们是o
文件的依赖项,但对于本机代码来说是如此。如果您希望人们能够使用您的库将代码编译为本机代码,则需要安装它们cma
是本机动态链接的cmxs
挂件。如果希望库的用户能够使用cmxa
模块将库作为插件动态加载到程序中,则需要安装它们Dynlink
文件位于cmx
中,但是您也可能需要安装它们的原因之一。如果可以在单独的编译时看到它们以及cmxa
文件,那么编译器就可以执行跨模块内联。然而,以这种方式单独编译的文件确实依赖于该实现,这意味着如果cmi
改变(即实现),即使cmx
(即接口)没有改变,它们也需要重新编译cmi
cmx
文件,这样您就可以针对cmi
单独编译,并且能够在不重新编译的情况下切换实现)是很好的(如果需要,请参阅-opaque
编译标志)
最后要注意的是,在OCaml中没有适当的名称间隔:每个顶级模块都是在全局名称空间中定义的。这意味着您在库中输入顶级模块名称时需要非常小心,,即使您不导出它们的cmi为您的库添加一个简短的前缀,例如
mylibu文件
而不是文件
(同样,即使文件
是cma
中的内部模块,但其cmi
未导出,也可能与其他库中定义的其他私有或公共文件
模块冲突)我想你可能会读到这一点:链接当前已失效(ERR_EMPTY_RESPONSE),但工作什么是cmxas
(我从未见过此扩展)?此外,你忘了提到.cmxs
。cmxas
是cmxs
的打字错误吗?