调用在C中需要unix.cma的OCaml函数

时间:2016-06-23 11:16:14

标签: c ocaml

我有一个OCaml库和一些在C中定义的包装器。 我按照http://caml.inria.fr/pub/docs/manual-ocaml/intfc.html(第19.8节)中的步骤编译了一个main.c程序 所以我可以测试一切。

问题是,当通过

初始化OCaml引擎时
caml_startup(argv); 
它给我带来了很多错误。其中之一是:

Undefined symbols for architecture x86_64:
"_unix_truncate", referenced from:
  _caml_builtin_cprim in modcaml.o

我该如何解决这个问题?

使用外部库时是否需要某种特殊链接?

编辑:

要编译我使用

cc -o prog -I `ocamlc -where` main.c mod.a -ltermcap

正如INRIA的指示。

主要代码用OCaml编写。

1 个答案:

答案 0 :(得分:0)

通常,使用ocamlbuild生成ocam字节代码为.o或C文件非常简单:

ocamlbuild program.byte.c

ocamlbuild program.byte.o

或使用好的RWO书中的说明: https://realworldocaml.org/v1/en/html/the-compiler-backend-byte-code-and-native-code.html

但是对于下一步,我们希望合并字节代码与我们的C代码,我们将遇到一些愚蠢的困难,以防我们的代码依赖于其他ocaml包。 由于您更喜欢使用C编译器/链接器,因此可以通过简单的技巧来了解您在代码中使用的ocaml库的位置:

ocamlc -where

您可以使用 nm 实用程序查找未定义符号所在的库:

find `ocamlc -where` -iname *.a |xargs nm -o |grep "T your_symbol"

如果您还记得使用过哪些库,可以使用更具体的管道:

find `ocamlfind query used_module` -iname *.a |xargs nm -o |grep "T your_symbol"

现在您知道所需的库及其路径,因此您可以修改CC的命令行。