如何使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)