使用ocamlbuild构建C ++代码

时间:2014-02-12 13:06:58

标签: c++ ocaml ocamlbuild

我找到了很多关于如何使用.o从C源构建ocamlbuild文件的指南。但是,这些不适用于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,其网站已不存在(我无法下载任何来源)。

有什么想法吗?

1 个答案:

答案 0 :(得分:6)

比照my answer to the similar question

我建议采用以下方法:

  1. 命名具有.c扩展名的c ++文件,以便ocamlc选择它们
  2. 告诉gcc这些实际上是带有-x c++
  3. 的c ++文件
  4. 告诉ocamlbuild构建实际上取决于.h文件(例如列出.h个文件以及.c CSources字段_oasis })
  5. 不要忘记明确链接-lstdc++因为gcc不会那样做C编译器
  6. 使用cxx_wrapped.h来获得真正的C ++感觉
  7. PROFIT !!
  8. 请参阅hypertable bindings作为此方法的示例。