2014-02-09 69 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如果庫提供它)