无法链接到libgfortran.a

我在我的系统上安装了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中定义。

链接: 完整的日志和源代码 。

注意: 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链接器从左到右解析静态库的链接依赖性列表。 如果任何依赖它的库之前指定静态库,则会跳过它,因为它在首次遇到处理时的链接列表没有依赖关系。