Сборка кода C++ с помощью 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, чей веб-сайт больше не работает (я не смог скачать исходники).

Любые идеи?


person Nikos    schedule 12.02.2014    source источник
comment
Разве вы не должны установить компилятор на g++ вместо gcc?   -  person Frank Schmitt    schedule 12.02.2014
comment
Извините, это была опечатка. Исправлено сейчас.   -  person Nikos    schedule 12.02.2014
comment
Не могли бы вы добавить содержимое вашего файла myocamlbuild.ml, а также командную строку, которую вы используете для компиляции?   -  person Frank Schmitt    schedule 12.02.2014
comment
Вы можете вызвать компилятор C напрямую из ocamlbuild вместо ocamlc. Хотя я не знаю, правильное ли это решение.   -  person nlucaroni    schedule 12.02.2014
comment
github.com/JoeDralliam/OcamlbuildCpp возможно, это полезно?   -  person rgrinberg    schedule 13.02.2014


Ответы (1)


ср. мой ответ на аналогичный вопрос.

Я рекомендую следующий подход:

  1. именовать файлы c++ с расширением .c, чтобы ocamlc подбирал их
  2. скажите gcc, что на самом деле это файлы c++ с -x c++
  3. сообщить ocamlbuild, что сборка на самом деле зависит от .h файлов (например, список .h файлов вместе с .c в поле CSources в _oasis)
  4. не забудьте связать -lstdc++ явно, потому что gcc не сделает этого, будучи компилятором C, это
  5. используйте cxx_wrapped.h, чтобы почувствовать настоящий C++
  6. ВЫГОДА!!

См. гипертабличные привязки в качестве примера такого подхода.

person ygrek    schedule 13.02.2014
comment
Спасибо, я добрался туда в конце концов с вашим предложением. Мне также пришлось вручную сделать компиляцию зависимой от фиксированного списка файлов заголовков, поскольку ни один из задействованных инструментов, похоже, не достаточно умен, чтобы выяснить зависимости C/C++. - person Nikos; 14.02.2014
comment
Действительно, добавил этот момент. Я предполагаю, что было бы не слишком сложно сделать плагин ocamlbuild для извлечения заголовков, но для меня достаточно фиксированного списка (я все равно указываю список .c файлов в CSources). - person ygrek; 14.02.2014