gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 23:57:21 25 4
gpt4 key购买 nike

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- 等工具使用indexodocodig

  • 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com