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

如何使OCamlbuild编译并将C文件链接到OCaml项目中?,c,ocaml,ocamlbuild,C,Ocaml,Ocamlbuild,我正试图从main.ml构建一个OCaml二进制文件main.native,它也依赖于单个C文件custom.C来实现一个新的原语。此C文件需要编译和链接。有没有一种方法可以只使用\u标签文件来实现这一点?显而易见的问题是,OCamlbuild在扫描main.ml时没有检测到依赖关系,因此需要明确告知依赖关系 ocamlbuild main.native OCamlbuild知道将*.c文件编译为*.o文件的规则,但我不知道如何添加依赖项。有一个规则 ocamlbuild main.nativ

我正试图从
main.ml
构建一个OCaml二进制文件
main.native
,它也依赖于单个C文件
custom.C
来实现一个新的原语。此C文件需要编译和链接。有没有一种方法可以只使用
\u标签
文件来实现这一点?显而易见的问题是,OCamlbuild在扫描
main.ml
时没有检测到依赖关系,因此需要明确告知依赖关系

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

有一个规则

ocamlbuild main.native
首先,您需要将
main.native
标记为在c-stub上创建依赖项并相应地链接。(顺便说一句,这假设c库名为
cstub
,但它可以是您想要的任何东西)

\u标签

<*.{byte,native}> : use_cstub
<**/*.cm{x,}a>    : use_cstub
(*.so和*.a),但您需要在
.clib
文件中添加要根据其生成的文件的列表

cstub.clib

cobjfile1.o
cobjfile2.o
...
任何头文件也需要从主目录复制到
\u build/
目录。这是通过指定它们依赖于c语言中的编译来实现的(在
build.ml
中,
headers
是命名项目中头文件的字符串列表

dep ["c"; "compile"] headers;
最后,当我们将项目链接到c-stub库时(也在
myocamlbuild.ml
中),向添加标志


我已接受上述答案,但希望记录解决方案。如评论中所述,我已使用
myocamlbuild.ml创建了一个新的参数化标记
linkdep()

open Ocamlbuild_plugin;;

dispatch 
    ( function 
    | After_rules -> pdep ["link"] "linkdep" (fun param -> [param])
    | _           -> ()
    )
新创建的标记用于
\u标记
以添加链接依赖项:

<*.ml>:     annot
<*.byte>:   linkdep(custom_unix_stubs.o),custom
<*.native>: linkdep(custom_unix_stubs.o)
:annot
:linkdep(custom\u unix\u stubs.o),custom
:linkdep(自定义\u unix\u stubs.o)

这依赖于内置规则将C文件编译为对象文件。但是,这仍然会丢失对头文件的依赖关系(我没有).

Oasis可以生成合适的
myocamlbuild.m
\u标记
文件。您尝试过吗?没有,我没有尝试过使用Oasis。主要原因是,如果可能的话,我不希望依赖OCaml发行版之外的工具。如果有必要,我会实现添加所需依赖项的
myocamlbuild.ml
。Oasis生成
myocamlbuild.ml
和其他文件。在没有安装oasis的情况下,结果似乎是可编译的。感谢您详细介绍。我想这也意味着:
myocamlbuild.ml
是必需的,仅使用
\u标记
无法解决此问题。非常有用。它提供了一个实现参数化标志
linkdep()。
<*.ml>:     annot
<*.byte>:   linkdep(custom_unix_stubs.o),custom
<*.native>: linkdep(custom_unix_stubs.o)