2011-11-28 5 views
6

ライブラリがリンカに追加される順番に問題があります。以前ocamlbuildによって構築されたライブラリは、flagルールに含まれるライブラリのリストの後にリンクされています。そして、私はmyocamlbuild.mlでもこのタイプの依存関係を定義する方法は見当たりません。ocamlbuildのリンクライブラリの順

具体的には、ライブラリ自体(z)が必要な以前に構築されたライブラリ(gzcaml)とのリンクが問題になります。 gccの新しいバージョンでは厳密さが増したので、-lzという引数はlibgzcaml.aの後に現れなければなりません。

私はすべてのこれらのライブラリを含めて、processが適切に、ライブラリを交互にしてA"-cclib"リストを作成

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

ています。

また、追加のライブラリが追加されています(冗長出力の-lm-ldl)が、これらを変更/追加することはできません。 (これは即座に私の問題を解決する)。

私のmyocamlbuild.mlは、それ以外の場合は私がここに含めておきます。上記のコードを、After_rulesの一番下まで移動してみました。そしてそれは順序を変更しますが、ocamlbuildが以前に作成したビルドライブラリ(cなど)の後には決してありません。以下は


EDIT は、私は上記の問題を解決するために、私のconfigureスクリプトとocamlbuildで使用したコードスニペットです。乾杯! myocamlbuild.ml.in

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

答えて

4

これで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 

は答えではありませんが、回避策は - -cclib -Wl,--no-as-neededで、この新しいリンカの動作を無効にします。

これはmantisにバグとして報告されるはずです。具体的には、ocamlbuildは、flagのオプションが、ソースで遭遇したのと同じ順序でコマンドラインに挿入されることを保証する必要があります(ocamlopt-cclib-ccopt引数の順序を保持する必要があります)コマンドラインで(これは現在のケースではありません)。

+0

ありがとうございました。問題のある人は、これらのフラグがすべてのライブラリの前にあることを確認してください。 – nlucaroni

+2

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

関連する問題