我找到了许多使用ocamlbuild
从C源代码构建.o
文件的指南。但是这些并不适用于C++文件,因为ocamlbuild
不能直接构建它们。
我尝试编写一个myocamlbuild.ml
文件(如下所示),提供了一个从.cpp
到.o
的规则,但是ocamlc
报错说它不知道如何处理.cpp
文件(即使编译器通过命令行标志设置为g++
)。
open Ocamlbuild_plugin ;;
let ext_obj = !Options.ext_obj;;
let x_o = "%"-.-ext_obj;;
rule "ocaml C++ stubs: cpp -> o"
~prod:x_o
~dep:"%.cpp"
begin fun env _build ->
let c = env "%.cpp" in
let o = env x_o in
let comp =
if Tags.mem "native" (tags_of_pathname c) then !Options.ocamlopt else !Options.ocamlc in
let cc =
Cmd(S[comp; T(tags_of_pathname c++"c"++"compile"); A"-custom"; A"-cc"; A"g++"; A"-c"; Px c]) in
if Pathname.dirname o = Pathname.current_dir_name then cc
else Seq[cc; mv (Pathname.basename o) o]
end;;
文件libsoundness.clib
由一堆 .o
文件组成。
当我执行ocamlbuild libsoundness.a
时,会得到以下输出:
Finished, 0 targets (0 cached) in 00:00:00.
+ /usr/bin/ocamlc.opt -custom -cc g++ -c src/soundness/proof_aut.cpp
/usr/bin/ocamlc.opt: don't know what to do with src/soundness/proof_aut.cpp.
Usage: ocamlc <options> <files>
<snipped long list of ocamlc options>
C++唯一的其他解决方案似乎是
ocamlbuild-ctools
,但其网站已经关闭(无法下载任何源代码)。有什么想法吗?
ocamlbuild
调用 C 编译器,而不是使用ocamlc
。但我不确定这是否是正确的解决方案。 - nlucaroni