2014-02-12 83 views
4

我发现了很多关于如何使用ocamlbuild从C源文件构建.o文件的指南。这些不适用于C++文件,但是,ocamlbuild无法在开箱即可使用。使用ocamlbuild编译C++代码

我试图写一个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其网站已经被淘汰(我无法下载任何来源)。

任何想法?

+0

不应该将编译器设置为g ++而不是gcc? –

+0

对不起,这是一个错字。现在更正。 – Nikos

+0

您可以添加myocamlbuild.ml文件的内容以及用于编译的命令行吗? –

回答

6

cf. my answer to the similar question

我推荐以下方法:

  1. 名称C++文件与.c扩展,使ocamlc挑选他们
  2. 告诉gcc,这些实际上是C++的文件与-x c++
  3. 告诉ocamlbuild是构建实际取决于.h文件(例如,在_oasisCSources字段中列出.h文件连同.c
  4. 不要忘了链接-lstdc++明确地引起gcc不会做,作为一个C编译器是
  5. 使用cxx_wrapped.h吃出真正的C++感觉
  6. 利润!

查看hypertable bindings作为这种方法的一个例子。

+0

谢谢,我最终以你的建议到达了那里。我也必须根据固定的头文件列表手动进行编译,因为所涉及的任何工具都不够聪明,无法找出C/C++依赖关系。 – Nikos

+0

确实,补充了这一点。我认为使ocamlbuild插件提取标题代码不会太困难,但对于我来说,固定列表足够好(我在'CSources'中指定'.c'文件列表)。 – ygrek