首页 > 解决方案 > 你如何在 ocaml 的编译器中使用 gcc 的 ar 实用程序?

问题描述

我可以使用 ocaml 对象文件创建一个静态库

ar rc ./lib/libprog.a ./_build/*.cmo

我可以使用显示 libprog.a 的内容

ar t ./lib/libprog.a

但我找不到任何解释如何将这个静态库与 ocaml 的编译器一起使用的文档。

有人可以发布一个示例(或提供一个链接),演示如何将 libprog.a 文件与 ocaml 的编译器一起使用。请不要使用 ocaml 构建实用程序的示例,因为我想看看它是如何使用 ocaml 的编译器在命令行中完成的。谢谢。

标签: ocaml

解决方案


OCaml 希望使用自己的存档格式。

$ cat a.ml
let x = 14
$ cat b.ml
let y = 17
$ cat main.ml
let () = Printf.printf "%d\n" (A.x + B.y)

$ ocamlc -c a.ml
$ ocamlc -c b.ml
$ ocamlc -a -o oclibab.cma a.cmo b.cmo

现在有一个名为 oclibab.cma 的 OCaml 存档(.cma 文件),其中包含模块 A 和 B:

$ ocamlobjinfo oclibab.cma
File oclibab.cma
Force custom: no
Extra C object files:
Extra C options:
Extra dynamically-loaded libraries:
Unit name: A
Interfaces imported:
    9b04ecdc97e5102c1d342892ef7ad9a2    Pervasives
    79ae8c0eb753af6b441fe05456c7970b    CamlinternalFormatBasics
    b162d96cf09fcde9d245f96359c9178a    A
Required globals:
Uses unsafe features: no
Force link: no
Unit name: B
Interfaces imported:
    9b04ecdc97e5102c1d342892ef7ad9a2    Pervasives
    79ae8c0eb753af6b441fe05456c7970b    CamlinternalFormatBasics
    bc583fd68fc2b0a4e44e3e640983c8dd    B
Required globals:
Uses unsafe features: no
Force link: no

请注意,此存档格式包含接口的数字签名。这允许在链接时进行比通常通过操作系统的库存工具链(如 ar)提供的更强大的检查。

$ ocamlc -o main oclibab.cma main.ml
$ ./main
31

推荐阅读