我有一个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编写。
答案 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的命令行。