Как получить флаги компоновщика OCaml для связи с C ++ сборки Cmake

Я пытаюсь связать некоторый код 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.

2

Решение

Я не могу полностью понять вашу проблему, но вот некоторые моменты, которые могут иметь отношение к делу:

  1. Я чувствую, что легче начать с ocaml и связать код c ++, чем наоборот, возможно, потому что ocaml более высокого уровня и артефакты сборки c ++ проще, поэтому меньше логики связывания для обработки
  2. Связывание вашего собственного кода c ++ с проектом ocaml ничем не отличается от связывания кода c, просто добавьте -xc ++ к флагам gcc и сохраните код в файлах .c, чтобы ocamlopt а также ocamlbuild подобрать их как таковые (и включить -lstdc++ в списке связанных библиотек)
  3. Связывать сторонний код c ++ проще, если хранить весь код c ++ как отдельный библиотечный архив и записывать в него привязки OCaml, а затем связывать эти привязки как обычную библиотеку OCaml через ocamlfind к основному проекту
  4. Вот пример — привязки для гипертабельной библиотеки 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 если библиотека это обеспечит)

2

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

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

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