我正在尝试将一些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文件中的额外链接器标志。
答案 0 :(得分:2)
我可能没有完全理解你的问题,但这里有一些可能相关的要点:
ocamlopt
和ocamlbuild
将它们作为这样(并在链接库列表中包含-lstdc++
)ocamlfind
将这些绑定作为通常的OCaml库链接到主项目以下是一个示例 - 超级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
)