Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ocaml 这些*.cm[a-z]文件是什么?我们什么时候需要它们_Ocaml - Fatal编程技术网

Ocaml 这些*.cm[a-z]文件是什么?我们什么时候需要它们

Ocaml 这些*.cm[a-z]文件是什么?我们什么时候需要它们,ocaml,Ocaml,OCaml有各种编译文件扩展名:*.a,*.cma,*.cmi,*.cmx,*.cmxa,*.cmxs(这可能不是详尽的列表)。它们是什么?在哪些情况下我需要它们 如果我有一个库,我需要附带哪些文件。我注意到有些人盲目地将所有的*.cm[a-z]文件安装到存档中,但这真的是必需的吗?是一个很好的资源,你可以阅读它来回答你的问题 总结如下: 首先,我建议您阅读和编译器的概述部分,因为这将大大提高您对这些文件的理解 现在更具体地说,如果您的库是一组模块,由一组.mli/.ml文件表示: cmi文件

OCaml有各种编译文件扩展名:
*.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
的打字错误吗?