背景:
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)
質問:
一部のルーチンのみの未定義の参照の理由は何ですか?また、出現順序が関連するのは何ですか?