我正在尝试将某些C ++ / cmake代码与某些OCaml代码链接在一起。如果C ++方面很简单,我只需将其目标文件添加到ocamlopt。如果OCaml方面很简单,我将其目标文件添加到cmake。但是它们都是具有很多依赖关系的复杂程序。
目前,我正在使用它,但是有点hack:
我运行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
这样拾取它们(并包括[ C0]在链接库列表中)-lstdc++
将OCaml库链接到主项目,则链接第三方c ++代码会更容易。>这里是一个示例-超表c ++库的绑定:ocamlfind
所有链接魔术都包含在_oasis中:
https://github.com/ygrek/ocaml-hypertable((如果库提供了,当然要使用
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
)