Я пытаюсь связать некоторый код C ++ / cmake с некоторым кодом OCaml. Если бы сторона C ++ была простой, я бы просто добавил ее объектный файл в ocamlopt. Если бы сторона OCaml была простой, я бы добавил ее объектный файл в cmake. Но они обе сложные программы с большим количеством зависимостей.
В настоящее время у меня это работает, но это немного взломать:
я бегу ocamlopt -output-obj
чтобы получить основной объект OCaml:
add_custom_command(
OUTPUT ocaml_main.o
DEPENDS ocaml.ml
COMMAND ocamlfind ocamlopt -package mylib -linkpkg -output-obj -o ocaml_main.o ocaml.ml
)
Я снова запускаю ocamlopt с -o
а также $PATH
установить, чтобы включить подделку gcc
исполняемый файл. Это подделка gcc
удаляет начальный -o ocaml_main.o
аргумент и все .o
файлы кроме std_exit.o
и распечатывает все остальное.
Этот вывод добавляется к аргументам CMake (используя target_link_libraries
).
Есть ли более чистый способ сделать это (то есть получить все зависимости OCaml, рекурсивно, готовые к связыванию)? Используя равнину ocamlfind query
получает меня часть пути, но скучает, например, дополнительные флаги компоновщика, встроенные в файлы cmxa.
Я не могу полностью понять вашу проблему, но вот некоторые моменты, которые могут иметь отношение к делу:
ocamlopt
а также ocamlbuild
подобрать их как таковые (и включить -lstdc++
в списке связанных библиотек)ocamlfind
к основному проектуВот пример — привязки для гипертабельной библиотеки c ++: http://hypertable.forge.ocamlcore.org/
Вся магия ссылок содержится в _oasis:
CCopt: -x c++ -O2 -Wno-deprecated -I/opt/hypertable/current/include
CClib: -L/opt/hypertable/current/lib -failsafe -lstdc++ -lHypertable -lHyperComm -lHyperDfsBroker -lHyperCommon -lHyperspace -lHyperTools -llog4cpp -lexpat -lboost_thread -lboost_iostreams -lboost_program_options -lboost_system -lsigar-amd64-linux -lz -lcurses -lrrd -lboost_filesystem
CSources: hypertable_stubs.c, cxx_wrapped.h
(конечно используйте pkg-config
если библиотека это обеспечит)
Других решений пока нет …