我正在尝试运行一个包含函数 dgesvx() 的 Fortran 脚本。我运行脚本为
gfortran -lblas -llapack -o cft numtype.o cfapprox.o cftest.o
输出是
gfortran -lblas -llapack -o cft numtype.o cfapprox.o cftest.o /usr/bin/ld: cfapprox.o: in function
__taylor_cf_approx_MOD_pade_coef':
cfapprox.f90:(.text+0x3c4): 对 dgesvx_' collect2: error: ld returned 1 exit status make: *** [Makefile:18: cft] Error 1
的未定义引用
我在 WSL 上运行 Ubuntu。
我安装了多个包含 blas 和 lapack 的库,当我编译时,它找到了 lapack 库。
令人惊讶的是,我无法快速找到与此相同的副本。但答案隐藏在对Lapack未定义引用的注释中引用“如果您链接静态库,链接器将删除到目前为止链中尚未引用的任何名称”和“默认情况下, GNU 链接器仅按顺序对库进行一次传递。您可以使用“
--start-group
”请求多次传递。把这个放在一起
gfortran cfapprox.o cftest.o -o cft -llapack -lblas
解决了这种特殊情况,并且作为一般经验法则,将要链接的所有库放在链接线的end处。
虽然我在这里注意到大多数 Linux 附带的 lapack 和 blas 库都没有优化 - 如果您安装并链接到 openblas,您可能会获得更好的性能 - 有关 Ubuntu 上的安装,请参阅 here。然后您可以简单地链接到
-lopenblas
。英特尔的 mkl 是另一种优化的替代方案。