2011-11-28 49 views
6

鏈接庫的我在與其中庫添加到鏈接器的順序問題。以前由ocamlbuild構建的庫鏈接在flag規則包含的庫列表之後。而且,我也沒有看到在myocamlbuild.ml中定義這種依賴關係的方法。秩序ocamlbuild

具體而言,問題出在與先前構建的庫(gzcaml)鏈接,該庫需要庫本身(z)。由於GCC的較新版本增加的嚴格的論證-lz必須libgzcaml.a後出現。

我,包括所有這些庫,

flag ["ocaml"; "link"] 
    (S (process "-cclib" clibs)) 

其中process創建一個列表交替圖書館和A"-cclib",恰如其分。

此外,額外的庫被追加(從詳細輸出,-lm-ldl),但我不知道如何修改/追加這些? (這會立即解決我的問題)。

myocamlbuild.ml是相當長的一樣,我會在這裏包含它。我試着將上面的代碼移到After_rules的底部。它確實改變了順序,但從未在之前創建的ocamlbuild構建的庫(c和其他)之後。


編輯 下面是我在我的配置腳本中使用的代碼片斷和ocamlbuild解決上述問題。乾杯!

configure.ac

oCFLAGS="$CFLAGS" 
CFLAGS="$FLAGS -Wl,--no-as-needed" 
AC_MSG_CHECKING([whether we need to add --no-as-needed linking option]) 
AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], 
            [[ 
             int main(){ return 0; } 
            ]])], 
        [AC_MSG_RESULT([yes]); CC_NOASNEEDED="true"], 
        [AC_MSG_RESULT([no]); CC_NOASNEEDED="false"]) 
CFLAGS=$oCFLAGS 

myocamlbuild.ml.in

if @[email protected] then 
    flag ["ocaml"; "link"] 
     (S [A"-cclib";A"-Wl,--no-as-needed"]); 

回答

4

這不是一個答案,但有解決方法 - 用-cclib -Wl,--no-as-needed禁用此新的鏈接器的行爲。

我想這應該被報告爲螳螂的錯誤。具體而言,ocamlbuild應該保證從flags的選項按照它們在源中遇到的相同順序插入到命令行中(現在是afair的情況),並且ocamlopt應該保留-cclib-ccopt參數的順序以及其他條目在命令行(現在不是這種情況)。

+0

謝謝你的工作很好。對於有問題的其他人,只要確保這些標誌位於所有庫之前。 – nlucaroni

+2

http://caml.inria.fr/mantis/view.php?id=5441 – ygrek