2014-02-09 28 views
2

我试图用一些OCaml的代码链接一些C++/cmake的代码。如果C++方面很简单,我只需将其目标文件添加到ocamlopt。如果OCaml方面很简单,我会将它的目标文件添加到cmake。但它们都是复杂的程序,有很多依赖关系。如何获得OCaml的连接标志使用C++链接的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 
    ) 
    
  • -o再次运行ocamlopt和$PATH设置为包含假冒gcc可执行文件。这种假gcc删除初始-o ocaml_main.o参数,除了std_exit.o所有.o文件和打印出的其余部分。

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

是否有一个更干净的方式来做到这一点(即获得所有的OCaml依赖关系,递归地,准备好链接)?使用普通的ocamlfind query可以让我成为其中的一部分,但是错过了例如嵌入在cmxa文件中的额外链接器标志。

回答

2

我可能不能完全掌握你的问题,但这里有一些点,可能是相关的:

  1. 我觉得这是更容易从ocaml的和链接C++代码开始不是反过来,可能是因为OCaml的是更多的高层次和C++建立文物是简单的,所以较少连接的逻辑来处理
  2. 将您自己的C++代码到ocaml的项目是连接C代码没有什么不同,只是增加-xC++在.C GCC标志和商店代码文件,以便ocamloptocamlbuild去接他们这样(和包括-lstdc++在链接库列表)
  3. 链接的第三方C++代码是比较容易,如果一个使所有C++代码作为单独的库归档和写入OCaml的绑定到,然后通过ocamlfind链接那些绑定像往常一样OCaml的库主体工程
  4. 下面是一个例子 - 为Hypertable的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如果库提供它)