ocaml — Сборка кода 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 чей сайт больше не существует (я не могу скачать ни одного источника).

Есть идеи?

4

Решение

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

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

  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. PROFIT !!

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

6

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]