【问题标题】:Is there a reason to retain .cmo or only .cma?是否有理由保留 .cmo 或仅保留 .cma?
【发布时间】:2011-12-25 17:17:30
【问题描述】:

说,我有mylibrary.ml,它为library.c 提供包装,我想进行字节码编译并提供mylibrary.ml 作为其他ocaml 代码的库。将其编译为字节码(我不考虑在这里将 ocaml 编译为本机代码)会产生许多文件,我想知道是否有任何理由保留它们?还是将它们全部提供给图书馆的其他用户?

我(到目前为止)知道我需要字节码库对象 mylibrary.cma 以便我可以在 ocaml 顶层使用 mylibrary 作为

ocaml mylibrary.cma

或者我可以

#load "mylibrary.cma";;

来自 ocaml 脚本。然后还需要编译的接口mylibrary.cmidllmylibrary.so(包含代码的C 部分)才能使上述工作正常工作。未编译的接口定义文件mylibrary.mli 很适合保留用于文档目的。

但是,如果我有mylibrary.cma 文件,是否还有理由保留mylibrary.cmo 文件?在什么样的情况下,有人也想拥有它?

编辑:我的意思是,我需要在 makefile 中构造.cmo,然后用它来构造.cma,但我想在此之后删除.cmo,以保持目录稍微干净。

【问题讨论】:

    标签: ocaml


    【解决方案1】:

    所以,显然不同文件的目的是(当将此限制为字节码编译器时):

    mylibrary.mli - 人类可读的接口定义(不是严格需要,编译器只需要 .cmi)
    mylibrary.cmi - 编译的接口,编译调用 mylibrary 的代码时需要
    library.o - C 目标文件
    dlllibrary.so - 由.o 组成的共享库对象
    dlllibrary.a - 由.o 组成的静态库对象
    mylibrary.cmo - 从mylibrary.ml 编译的字节码对象
    mylibrary.cma - 字节码库

    那么,从顶层加载 mylibrary 时需要mylibrary.cma(与mylibrary.cmidlllibrary.so):

    #load "mylibrary.cma";;

    可以编译一个与mylibrary.cma动态链接的字节码程序(还需要mylibrary.cmidlllibrary.so):

    ocamlc mylibrary.cma <program>.ml

    动态链接字节码对象,而不是字节码库(所需文件:mylibrary.cmomylibrary.cmidlllibrary.so):

    ocamlc dlllibrary.so mylibrary.cmo <program>.ml

    (注意:然后使用ocamlrun -I . <program> 运行字节码,假设dlllibrary.so 在当前目录中。)

    与对象静态链接(所需文件:mylibrary.cmomylibrary.cmiliblibrary.a

    ocamlc -custom liblibrary.a mylibrary.cmo <program>.ml

    静态链接库对象(所需文件:mylibrary.cmamylibrary.cmiliblibrary.a

    ocamlc -custom -I . mylibrary.cma <program>.ml

    因此,根据将来如何使用该库,需要不同的文件。除了 .mli 只需要人类读者使用,从 C 库编译的目标文件.o 不需要(但在某些情况下编译为本机代码时会需要)。

    【讨论】:

      【解决方案2】:

      您甚至应该保留库的源代码。在升级 Ocaml 编译器时(例如从 3.12 升级到未来的 3.13),以前的 *.cmo*.cma 文件在不重新编译的情况下将无法工作。

      假设你总是可以清理和重新编译东西(例如你有两个传统目标cleanallmake)你只能保留*.cma

      【讨论】:

      • 是的,我当然会保留源代码。我只是在想,是否有人愿意使用 .cmo 而不是 .cma。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-25
      • 1970-01-01
      • 1970-01-01
      • 2012-01-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多