4

我找到了许多关于如何.o使用ocamlbuild. 但是,这些不适用于ocamlbuild不能开箱即用的 C++ 文件。

我尝试编写一个myocamlbuild.ml文件(在请求后如下所示),提供一个规则 from .cppto.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其网站已失效(我无法下载任何资源)。

有任何想法吗?

4

1 回答 1

6

参看。我对类似问题的回答

我推荐以下方法:

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

请参阅超表绑定作为此方法的示例。

于 2014-02-13T05:08:47.890 回答