6

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

具体的には、問題はgzcaml、ライブラリ自体()を必要とする以前に構築されたライブラリ()とのリンクにありzます。gccの新しいバージョンでは厳密性が追加されているため、引数は。の-lz後に表示する必要がありますlibgzcaml.a

私はこれらすべてのライブラリをに含めています、

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

ここでprocess、ライブラリとを交互にリストを作成しA"-cclib"ます。

また、追加のライブラリが(詳細出力から-lm)追加されますが-ldl、これらを変更/追加する方法がわかりませんか?(これは私の問題を即座に解決します)。

myocamlbuild.mlはかなり長いです、そうでなければ私はそれをここに含めたでしょう。上記のコードをの下部、上部に移動してみましたAfter_rules。また、順序は変更されますが、ocamlbuildが以前に作成したビルド済みライブラリ(cなど)の後には変更されません。


編集 以下は、上記の問題を解決するためにconfigureスクリプトと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 @CC_NOASNEEDED@ then
     flag ["ocaml"; "link"]
         (S [A"-cclib";A"-Wl,--no-as-needed"]);
4

1 に答える 1

4

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

これはカマキリのバグとして報告されるべきだと思います。具体的にocamlbuildは、sのオプションflagがソースで検出されたのと同じ順序でコマンドラインに挿入されることを保証し(これは現在は公平です)、コマンドラインの他のエントリocamloptの順序-cclibと引数を保持する必要があります-ccopt(これは現在は当てはまりません)。

于 2011-11-29T13:16:43.553 に答える