“对'dgesvx_'的未定义引用”,尽管 LAPACK 已安装并位于

"undefined reference to `dgesvx_'" although LAPACK is installed and located

提问人:Mr. Cohen 提问时间:9/27/2023 更新时间:9/28/2023 访问量:62

问:

我正在尝试运行包含函数 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 库。

Linux Fortran Gfortran Lapack

评论

1赞 Ian Bush 9/27/2023
对于链接文件的顺序很重要。如果将库放在最后会发生什么?
0赞 Ian Bush 9/27/2023
现在我在一个合适的键盘上,令人惊讶的是我无法快速找到重复项,尽管仔细想想可能有两个原因 - stackoverflow.com/questions/33883215/lapack-undefined-reference 的一个或两个(见评论)stackoverflow.com/questions/20669410/......可能会有所帮助。但是,请告诉我们,如果您尝试会发生什么gfortran cfapprox.o cftest.o -o cft -llapack -lblas
1赞 Mr. Cohen 9/28/2023
这对我有用,谢谢!做工作。gfortran cfapprox.o cftest.o -o cft -llapack

答:

0赞 Ian Bush 9/28/2023 #1

令人惊讶的是,我无法快速找到与此重复的副本。但答案隐藏在对 Lapack undefined reference 的评论中:引用那里的话:“如果你正在链接静态库,链接器将删除到那时为止尚未在链中引用的任何名称”和“默认情况下,GNU 链接器只按顺序对库进行一次传递。您可以使用“.把这些放在一起--start-group

gfortran cfapprox.o cftest.o -o cft -llapack -lblas

解决了这种特殊情况,并且作为一般经验法则,将要链接的所有库放在链接行的末尾

当我在这里时,请注意大多数 Linux 附带的 lapack 和 blas 库没有优化 - 如果您安装和链接 openblas,您可能会获得更好的性能 - 请参阅此处在 Ubuntu 上的安装。然后,您可以简单地链接到 .英特尔的 mkl 是另一种优化的替代方案。-lopenblas