1

背景:
C と Fortran 77 の混合で書かれたプロジェクトに取り組んでおり、LAPACK/BLAS ライブラリをプロジェクトにリンクする必要があります (すべて Linux 環境内)。問題の LAPACK は、netlib.org のバージョン 3.2.1 (BLAS を含む) です。ライブラリは、最上位の Makefile (make lapacklib および make blaslib) を使用してコンパイルされました。

問題:
リンク中に、LAPACK ルーチンから呼び出された特定の (すべてではない) BLAS ルーチンが未定義であるというエラー メッセージが表示されました。これは頭​​を悩ませましたが、(Makefileで)リンクされるライブラリの出現順序が変更されたときに、問題は最終的に解決されました。

コード:
次の (a) ではエラーが発生しますが、(b) では発生しません。リンクは (c) によって実行されます。
(a) LIBS = $(LAPACK)/blas_LINUX.a $(LAPACK)/lapack_LINUX.a
(b) LIBS = $(LAPACK)/lapack_LINUX.a $(LAPACK)/blas_LINUX.a
(c) gcc -Wall -O -o $@ project.o project.a $(LIBS)

質問:
一部のルーチンのみの未定義の参照の理由は何ですか?また、出現順序が関連するのは何ですか?

4

3 に答える 3

1

LAPACKライ​​ブラリにはBLASからのものが必要であり、リンカーは左から右に検索します。したがって、LAPACK(オプション(b))の後にBLASを配置すると、機能しました。

順序に関係なく、常に機能させたい場合は、リンカーグループを使用できます。

-Wl,--start-group $(LAPACK)/blas_LINUX.a $(LAPACK)/lapack_LINUX.a -Wl,--end-group

これは、すべてのシンボルが解決されるまで(または、再度ループしても効果がないことに気付くまで)、ライブラリをループするようにリンカに指示します。

于 2012-06-20T13:38:18.600 に答える
0

clapackはLAPACKの実装として使用されていますか?いいえの場合は、それを使用してみることができます。

于 2011-03-10T20:59:23.063 に答える
0

通常、「より基本的/基本的な」ライブラリを「基本的でない/基本的ではない」ライブラリの右側に配置します。つまり、リンカは、ファイルに表示される関数の定義をファイルの右側に探します。これは、最新のリンカーでは不要になったと思われますが、常に良い考えです(あなたの場合のように)。なぜそれがいくつかのルーチンでのみ重要なのかはわかりません。

于 2010-05-11T00:02:27.227 に答える