提问人:Mr. Cohen 提问时间:9/27/2023 更新时间:9/28/2023 访问量:62
“对'dgesvx_'的未定义引用”,尽管 LAPACK 已安装并位于
"undefined reference to `dgesvx_'" although LAPACK is installed and located
问:
我正在尝试运行包含函数 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 undefined reference 的评论中:引用那里的话:“如果你正在链接静态库,链接器将删除到那时为止尚未在链中引用的任何名称”和“默认情况下,GNU 链接器只按顺序对库进行一次传递。您可以使用“.把这些放在一起--start-group
gfortran cfapprox.o cftest.o -o cft -llapack -lblas
解决了这种特殊情况,并且作为一般经验法则,将要链接的所有库放在链接行的末尾。
当我在这里时,请注意大多数 Linux 附带的 lapack 和 blas 库没有优化 - 如果您安装和链接 openblas,您可能会获得更好的性能 - 请参阅此处在 Ubuntu 上的安装。然后,您可以简单地链接到 .英特尔的 mkl 是另一种优化的替代方案。-lopenblas
评论
gfortran cfapprox.o cftest.o -o cft -llapack -lblas
gfortran cfapprox.o cftest.o -o cft -llapack