Я нашел много руководств о том, как построить .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
чей сайт больше не существует (я не могу скачать ни одного источника).
Есть идеи?
ср мой ответ на аналогичный вопрос.
Я рекомендую следующий подход:
.c
расширение так, чтобы ocamlc
подбирает ихgcc
что это на самом деле файлы C ++ с -x c++
ocamlbuild
что сборка на самом деле зависит от .h
файлы (например, список .h
файлы вместе с .c
в CSources
поле в _oasis
)-lstdc++
явно причина gcc
не будет делать это, будучи компилятором C, этоУвидеть гипертабельные привязки в качестве примера такого подхода.
Других решений пока нет …