libgfortran.a[duplicate]にリンクできません



libgfortran 3 dylib (1)

私はgfortranを自分のシステムにインストールしており、 libgfortran.aファイルは/usr/lib/gcc/x86_64-linux-gnu/4.6/ます。 nmを使って、 _gfortran_compare_string関数がそこに定義されていることを確認しました:

$ nm /usr/lib/gcc/x86_64-linux-gnu/4.6/libgfortran.a | grep _gfortran_compare_string

返品

0000000000000000 T _gfortran_compare_string
0000000000000000 T _gfortran_compare_string_char4

しかし、私のCUDA-Cプログラムのリンカはエラーを投げます:

/usr/local/cuda-6.0/bin/nvcc --cudart static -L/usr/lib/gcc/x86_64-linux-gnu/4.6 -L/home/chung/lapack-3.5.0 -link -o  "pQP"  ./src/pQP.o   -lgfortran -llapacke -llapack -lcublas -lblas -lcurand
nvcc warning : The 'compute_10' and 'sm_10' architectures are deprecated, and may be removed in a future release.
/home/chung/lapack-3.5.0/liblapack.a(ilaenv.o): In function `ilaenv_':
ilaenv.f:(.text+0x81): undefined reference to `_gfortran_compare_string'

後でlibgfortranに関連した別のエラーが発生しました。

/home/chung/lapack-3.5.0/liblapack.a(xerbla.o): In function `xerbla_':
xerbla.f:(.text+0x49): undefined reference to `_gfortran_st_write'
xerbla.f:(.text+0x54): undefined reference to `_gfortran_string_len_trim'
xerbla.f:(.text+0x66): undefined reference to `_gfortran_transfer_character_write'
xerbla.f:(.text+0x76): undefined reference to `_gfortran_transfer_integer_write'
xerbla.f:(.text+0x7e): undefined reference to `_gfortran_st_write_done'
xerbla.f:(.text+0x87): undefined reference to `_gfortran_stop_string'

しかし、再びnmを使って、 _gfortran_st_writeなどがlibgfortran.aで定義されていることが_gfortran_st_writeました。

リンク: 完全なログソースコード

注: Lapackはlibgfortranを利用しています。 私は最近lapackをインストールし、すべてのテストを実行し、それらはすべて合格しました。


リンカーに静的ライブラリを指定する順序を変更する必要があります。 あなたが次のようなことをすれば:

nvcc --cudart static -L/usr/lib/gcc/x86_64-linux-gnu/4.6 \
-L/home/chung/lapack-3.5.0 -link -o  "pQP"  ./src/pQP.o  \ 
-llapacke -llapack -lcublas -lblas -lcurand -lgfortran 

それはうまくいくはずです。

根本的な理由(これはgcc / gnuツールチェーンの特徴であり、nvccとは関係ありません)は、静的ライブラリの依存関係リストのリンクがgnuリンカーによって左から右に解析されるということです。 それに依存するライブラリーの前にスタティックライブラリーを指定すると、そのライブラリーが最初に出会った時点のリンクリストに依存関係がないため、スキップされます