【问题标题】:Building C++ code with ocamlbuild使用 ocamlbuild 构建 C++ 代码
【发布时间】:2020-05-12 01:53:25
【问题描述】:

我找到了许多关于如何使用 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 吗?
  • 抱歉,打错了。现已更正。
  • 能否添加 myocamlbuild.ml 文件的内容以及用于编译的命令行?
  • 你可以直接从ocamlbuild而不是ocamlc调用C编译器。我不知道这是否是正确的解决方案。
  • github.com/JoeDralliam/OcamlbuildCpp 也许这有帮助?

标签: c++ ocaml ocamlbuild


【解决方案1】:

参见。 my answer to the similar question.

我推荐以下方法:

  1. 使用 .c 扩展名命名 c++ 文件,以便 ocamlc 提取它们
  2. 告诉gcc 这些实际上是带有-x c++ 的c++ 文件
  3. 告诉ocamlbuild,构建实际上依赖于.h 文件(例如,在_oasisCSources 字段中列出.h 文件和.c
  4. 不要忘记明确链接 -lstdc++,因为 gcc 作为 C 编译器不会这样做
  5. 使用 cxx_wrapped.h 获得真正的 C++ 感觉
  6. 利润!!

请参阅 hypertable bindings 作为此方法的示例。

【讨论】:

  • 谢谢,我最终得到了你的建议。我还必须手动使编译依赖于一个固定的头文件列表,因为所涉及的工具似乎都不够聪明,无法找出 C/C++ 依赖项。
  • 确实,补充了这一点。我认为制作 ocamlbuild 插件来提取头文件并不会太难,但对我来说,一个固定列表就足够了(我在 CSources 中指定了 .c 文件的列表)。
猜你喜欢
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
  • 1970-01-01
  • 2013-02-07
相关资源
最近更新 更多