如何获取OCaml链接器标志以与C ++ cmake构建链接

问题描述 投票:2回答:1

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

c++ build linker cmake ocaml
1个回答
2
投票

我可能没有完全理解您的问题,但以下几点可能是相关的:

  1. 我觉得从ocaml开始并在其中链接c ++代码要容易得多,反之亦然,这可能是因为ocaml级别更高,而c ++构建工件更简单,因此处理的链接逻辑更少
  2. 将您自己的c ++代码链接到ocaml项目与链接c代码没有什么不同,只需将-xc ++添加到gcc标志并将代码存储在.c文件中,以便ocamloptocamlbuild这样拾取它们(并包括[ C0]在链接库列表中)
  3. 如果将所有c ++代码保留为单独的库存档并向其写入OCaml绑定,然后像往常一样通过-lstdc++将OCaml库链接到主项目,则链接第三方c ++代码会更容易。>
  4. 这里是一个示例-超表c ++库的绑定:ocamlfind

  5. 所有链接魔术都包含在_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

© www.soinside.com 2019 - 2024. All rights reserved.