【问题标题】:How to get OCaml linker flags to link with C++ cmake build如何让 OCaml 链接器标志与 C++ cmake build 链接
【发布时间】:2014-03-06 16:44:43
【问题描述】:

我正在尝试将一些 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 参数和除std_exit.o 之外的所有.o 文件,并打印出其余部分。

  • 此输出被添加到 CMake 参数中(使用 target_link_libraries)。

有没有更简洁的方法来做到这一点(即递归地获取所有 OCaml 依赖项,准备好链接)?使用普通的ocamlfind query 可以让我参与其中,但会错过例如嵌入在 cmxa 文件中的额外链接器标志。

【问题讨论】:

    标签: c++ build linker cmake ocaml


    【解决方案1】:

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

    1. 我觉得从 ocaml 入手并链接 c++ 代码比反之更容易,可能是因为 ocaml 更高级,而 c++ 构建工件更简单,因此需要处理的链接逻辑较少
    2. 将您自己的 c++ 代码链接到 ocaml 项目与链接 c 代码没有什么不同,只需将 -xc++ 添加到 gcc 标志并将代码存储在 .c 文件中,以便 ocamlopt 和 ocamlbuild 照此提取它们(并包括-lstdc++ 在链接库列表中)
    3. 如果将所有 c++ 代码保存为单独的库存档并将 OCaml 绑定写入其中,然后将这些绑定作为通常的 OCaml 库通过 ocamlfind 链接到主项目,则链接第三方 c++ 代码会更容易
    4. 这是一个示例 - 超表 c++ 库的绑定:https://github.com/ygrek/ocaml-hypertable

      所有的链接魔法都包含在 _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)

    【讨论】:

      猜你喜欢
      • 2011-04-02
      • 1970-01-01
      • 1970-01-01
      • 2014-08-23
      • 2020-05-13
      • 2023-03-04
      • 1970-01-01
      • 2021-04-01
      相关资源
      最近更新 更多