5

私はいくつかのソフトウェアのリリースを行おうとしていますが、現在ビルドプロセスのスクリプトを使用しています。x86_64 linuxでLAPACKを静的にリンクするという、思いもよらなかった何かに固執しています。構成中AC_SEARCH_LIB([main],[lapack])は機能しますが、lapackユニットのコンパイルは機能しません。たとえば、undefiend reference to 'dsyev_'lapack/blasルーチンが見過ごされることはありません。

ライブラリがインストールされていることを確認し、同じ結果で静的にするための適切なオプションを使用してライブラリを自分でコンパイルしました。

数年前にLAPACKを初めて使用したときに使用した例を次に示します。これは動的に機能しますが、静的には機能しません。http: //pastebin.com/cMm3wcwF

私がコンパイルに使用している2つの方法は、次のとおりです。

gcc -llapack -o eigen eigen.c
gcc -static -llapack -o eigen eigen.c
4

1 に答える 1

6

リンク順序が間違っています。ライブラリを必要とするコードの前ではなく、後でライブラリをリンクします。このような:

gcc -o eigen eigen.c -llapack 
gcc -static -o eigen eigen.c -llapack

これでリンケージの問題が解決するはずです。


なぜこれが機能するのかという次の質問に答えるために、GNUのldドキュメントには次のように書かれています。

コマンドのどこにこのオプションを書くかによって違いが生じます。リンカは、指定された順序でライブラリとオブジェクトファイルを検索して処理します。したがって、foo.o -lz bar.o' searches libraryファイルfoo.oの後、bar.oの前のz'。bar.oが`z'の関数を参照している場合、それらの関数はロードされない可能性があります。

.......。

通常、この方法で検出されるファイルはライブラリファイル、つまりメンバーがオブジェクトファイルであるアーカイブファイルです。リンカは、これまでに参照されているが定義されていないシンボルを定義するメンバーをスキャンすることにより、アーカイブファイルを処理します。ただし、見つかったファイルが通常のオブジェクトファイルの場合は、通常の方法でリンクされます。

すなわち。リンカは、ファイルを1回通過して未解決のシンボルを探し、指定した順序(つまり、「左から右」)でファイルを追跡します。ファイルの読み取り時に依存関係をまだ指定していない場合、リンカは依存関係を満たすことができません。リンクリスト内のすべてのオブジェクトは1回だけ解析されます。

また、GNU ldは、共有ライブラリまたはオブジェクトファイルをリンクするときに循環依存関係が検出された場合に並べ替えを実行できることにも注意してください。ただし、静的ライブラリは、不明なシンボルに対して1回だけ解析されます。

于 2011-08-24T16:13:54.660 に答える