使用ocamlbuild构建C++代码

4

我找到了许多使用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,但其网站已经关闭(无法下载任何源代码)。
有什么想法吗?

你应该将编译器设置为g++而不是gcc吧? - Frank Schmitt
抱歉,那是一个打错的字。现在已经更正了。 - Nikos
您能提供您的myocamlbuild.ml文件内容和编译时使用的命令行吗? - Frank Schmitt
你可以直接从 ocamlbuild 调用 C 编译器,而不是使用 ocamlc。但我不确定这是否是正确的解决方案。 - nlucaroni
1
也许这个链接有帮助:https://github.com/JoeDralliam/OcamlbuildCpp - rgrinberg
1个回答

6

参考 类似问题的我的回答

我建议采用以下方法:

  1. 将 c++ 文件命名为 .c 扩展名,以便 ocamlc 可以选择它们
  2. 使用 -x c++ 告诉 gcc 它们实际上是 c++ 文件
  3. 告诉 ocamlbuild 构建实际上依赖于 .h 文件(例如,在 _oasis 中将 .h 文件与 .c 文件一起列在 CSources 字段中)
  4. 不要忘记显式链接 -lstdc++,因为 gcc 是 C 编译器而不会自动链接
  5. 使用 cxx_wrapped.h 使其具有真正的 C++ 感觉
  6. 利润!!

可以查看 hypertable 绑定 作为此方法的示例。


谢谢,最终我按照你的建议完成了。我还不得不手动将编译依赖于一个固定的头文件列表,因为似乎涉及的工具都不够聪明,无法找出C/C++的依赖关系。 - Nikos
确实,加上那个点。我认为制作一个ocamlbuild插件来提取头文件依赖关系不会太难,但对我来说,固定列表已经足够好了(反正我在CSources中指定了.c文件的列表)。 - ygrek

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接