如何让OCamlbuild编译并将C文件链接到OCaml项目?

Chr*_*dig 6 c ocaml ocamlbuild

我正在尝试构建一个OCaml二进制文件main.native,main.ml它依赖于单个C文件custom.c来实现一个新的原语.需要编译和链接此C文件.有没有办法只用一个_tags文件来做到这一点?显而易见的问题是OCamlbuild在扫描时没有检测到依赖关系main.ml,因此需要明确告知依赖关系.

ocamlbuild main.native
Run Code Online (Sandbox Code Playgroud)

OCamlbuild知道将*.c文件编译为*.o文件的规则,但我不知道如何添加依赖项.

nlu*_*oni 6

有一个数量 资源 那里.

首先,您需要标记main.nativeas以创建对c-stub的依赖关系并相应地进行链接.(顺便说一下,这假定调用了c库cstub,但它可以是你想要的任何东西).

_tags :

<*.{byte,native}> : use_cstub
<**/*.cm{x,}a>    : use_cstub
Run Code Online (Sandbox Code Playgroud)

然后,在myocamlbuild.ml创建c库对标记的东西的依赖关系时,

dep ["link";"ocaml";"use_cstub"] ["libcstub.a"]
Run Code Online (Sandbox Code Playgroud)

OCamlbuild有创建库文件的规则(*.so和*.a),但是你需要在文件中添加要构建的.clib文件列表,

cstub.clib :

cobjfile1.o
cobjfile2.o
...
Run Code Online (Sandbox Code Playgroud)

任何头文件也需要从主目录复制到_build/目录.这是通过指定它们是对c中编译的依赖来完成的(myocamlbuild.ml其中,headers是一个命名项目中头文件的字符串列表.

dep ["c"; "compile"] headers;
Run Code Online (Sandbox Code Playgroud)

最后,在我们将项目与c-stub库(也在myocamlbuild.ml)中链接时添加标志,

flag ["link";"ocaml";"use_cstub"] (S[A"-dllib";A"-lcstub";A"-cclib";A"-lcstub"]);
Run Code Online (Sandbox Code Playgroud)