如何让OCaml链接器标志与C ++ cmake构建链接

时间:2014-02-09 12:02:42

标签: c++ build linker cmake ocaml

我正在尝试将一些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文件中的额外链接器标志。

1 个答案:

答案 0 :(得分:2)

我可能没有完全理解你的问题,但这里有一些可能相关的要点:

  1. 我觉得从ocaml和链接c ++代码开始比反之亦然更容易,可能是因为ocaml更高级别并且c ++构建工件更简单,因此处理的链接逻辑更少
  2. 将您自己的c ++代码链接到ocaml项目与链接c代码没什么不同,只需将-xc ++添加到gcc标记并将代码存储在.c文件中,以便ocamloptocamlbuild将它们作为这样(并在链接库列表中包含-lstdc++
  3. 如果将所有c ++代码保存为单独的库存档并将OCaml绑定写入其中,然后通过ocamlfind将这些绑定作为通常的OCaml库链接到主项目
  4. ,则链接第三方c ++代码会更容易
  5. 以下是一个示例 - 超级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