- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
OCaml 对编译后的文件有多种扩展名:*.a
, *.cma
, *.cmi
, *.cmx
、*.cmxa
、*.cmxs
(也许这不是详尽的列表)。它们是什么,在什么情况下我需要它们?
如果我有一个库,我需要附带哪些文件。我注意到有些人盲目地将所有 *.cm[a-z] 文件安装到存档中,但这真的是必需的吗?
最佳答案
首先,我建议您阅读 byte code 的概述部分和 native code编译器,因为这将大大提高您对这些文件是什么的理解。
现在更具体地说,如果您的库是由一组 .mli
/.ml
文件表征的一组模块:
cmi
文件包含模块的已编译接口(interface)(编译 .mli
文件的结果)。对于您希望其他人能够使用的库中的每个模块,您需要安装它们(即 cmi
定义您的公共(public)接口(interface))。安装 mli
文件也是一个好习惯,这样人们就可以查看它们。现在,您还应该安装 cmti
文件(使用 -bin-annot
选项生成),这些文件是带注释的编译接口(interface),可以被 ocp- 等工具使用index
、odoc
和 odig
。
cma
文件保存了您的库的字节码编译结果(cmo
文件)。如果您希望人们能够将您的库编译为字节码,则应该安装它们。
cmxa
和 .a
文件包含 native 代码编译结果的存档 (cmx
/o
文件)。它们是 cma
文件的附属文件,但用于 native 代码。如果您希望人们能够将您的库编译为 native 代码,则需要安装它们。
cmxs
是用于 native 动态链接的 cmxa
的附属物。如果您希望库的用户能够使用 Dynlink
模块将您的库作为插件动态加载到他们的程序中,则需要安装它们。
cmx
文件位于 cmxa
中,但是您可能还想安装它们的原因之一。如果它们可以在单独的编译时间与 cmi
文件一起看到,它们允许编译器执行跨模块内联。然而,以这种方式单独编译的文件确实依赖于该实现,这意味着如果 cmx
更改(即实现),即使 cmi
(即接口(interface))没有。
请注意,一般来说,如果您能够编译并安装这些文件的所有
(尽管有时出于某些原因您可能不想安装
(如果需要,请参阅 cmx
文件,以便您可以针对
cmi
单独编译,并且无需重新编译即可切换实现)
-opaque
编译标志这个)。
最后要注意的是,在 OCaml 中没有适当的名称间距:每个顶层模块都在全局命名空间中定义。这意味着您在放入库中的顶层模块名称时需要非常小心,即使您不导出它们的 cmi。特别要避免其他图书馆可能使用的通用术语,为您的图书馆使用短前缀,例如MyLib_file
而不是 File
(即使 File
原来是你在 cma
中的内部模块但是你不导出它的 cmi
可能会与其他库中定义的其他私有(private)或公共(public) File
模块发生冲突)
关于ocaml - 这些 *.cm[a-z] 文件是什么以及我们何时需要它们,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25422560/
我是一名优秀的程序员,十分优秀!