2013-12-18 35 views
6

私はのgfortran LAPACK "未定義の参照" エラー

gfortran -llapack -lblas randomsys1.f90 
    gfortran -llapack -L/usr/lib/lapack -lblas -L/usr/lib/libblas randomsys1.f90 
、したがって、私は /usr/lib/libblas/libblas.a/usr/lib/lapack/liblapack.aを見つけ、その後、 randomsys1 examplegfortranでそれをテストすることができ、 the instructionに従うことによって、Ubuntuで

sudo apt-get install liblapack-dev 

をLAPACKをインストール

私は以下のエラーを受け取りました(dgesvはLAPACKルーチンです):

/tmp/ccnzuuiY.o: In function `MAIN__': 
randomsys1.f90:(.text+0xb): undefined reference to `init_random_seed_' 
randomsys1.f90:(.text+0x3c2): undefined reference to `dgesv_' 
collect2: ld returned 1 exit status 

LAPACKをインストールするには何か問題はありますか?どうもありがとう!

+5

コンパイルしようとしているファイルの名前の後ろにリンクコマンド(つまり、-llapack -lblas)*を入れてみてください。そうしないと、リンカーは間違った順序でシンボルを解決しようとします。 – janneb

+1

ありがとう、@janneb!それはうまくいった! – Randel

答えて

5

gcc/gfortran documentationを参照してください:

-llibrary-l library

は、リンク時にライブラリという名前のライブラリを検索します。 (別の引数としてライブラリを使用する2番目の方法は、POSIX に準拠したものであり、推奨されません)。

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

リンカーはライブラリのディレクトリの標準リストを検索します。これは実際にはliblibrary.aという名前のファイルです。リンカーは のように、このファイルを正確に名前で指定したものとして使用します。

検索されるディレクトリには、いくつかの標準システムディレクトリに加えて、-Lで指定したディレクトリが含まれます。

通常、この方法で見つかったファイルは、ライブラリファイルです。ライブラリファイルは、メンバーがオブジェクトファイルであるアーカイブファイルです。リンカはアーカイブファイルを で処理し、これまでに が参照されているが定義されていないシンボルを定義するメンバをスキャンします。しかし、見つかったファイルが 普通のオブジェクトファイルであれば、通常の方法でリンクされています。 -lオプションの使用とファイル名の指定の違いは で、-lはライブラリを 'lib'と '.a'で囲み、複数のディレクトリを検索します( )。

だからので、コンパイラはあなたのライブラリーを含むディレクトリを認識している最初の-L/directory/of/the/libraryを配置する必要があり、かつその後-llibraryフラグ。

+0

ありがとう@MBR!問題は@ jannebの上記のコメントによって解決されました。 – Randel