gfortran在LAPACK中出现“未定义引用”错误

6

我按照这份指南在Ubuntu上安装了LAPACK。

sudo apt-get install liblapack-dev

因此我可以找到 /usr/lib/libblas/libblas.a/usr/lib/lapack/liblapack.a,然后在 gfortran 中使用randomsys1 示例进行测试。

  gfortran -llapack -lblas randomsys1.f90
  gfortran -llapack -L/usr/lib/lapack -lblas -L/usr/lib/libblas randomsys1.f90

但是我收到了以下错误信息(dgesv 是一个 LAPACK 子例程):
/tmp/ccnzuuiY.o: In function `MAIN__':
randomsys1.f90:(.text+0xb): undefined reference to `init_random_seed_'
randomsys1.f90:(.text+0x3c2): undefined reference to `dgesv_'
collect2: ld returned 1 exit status

安装 LAPACK 有什么问题吗?非常感谢!

6
尝试将链接命令(即 -llapack -lblas)放在你要编译的文件名之后。否则,链接器可能会按错误的顺序解析符号。 - janneb
1
非常感谢,@janneb!它确实起作用了! - Randel
1个回答

6
请参考gcc/gfortran文档

-llibrary-l library

在链接时搜索名为library的库。(将库作为单独参数的第二种替代方法仅为POSIX遵从性,不建议使用。)

输入此选项的命令的位置很重要; 链接器按照指定的顺序搜索和处理库和目标文件。 因此,“foo.o -lz bar.o”在文件foo.o之后但在bar.o之前搜索库“z”。 如果bar.o引用'z'中的函数,则这些函数可能无法加载。

链接器为该库搜索一组标准目录,实际上是一个名为liblibrary.a的文件。 然后,链接器将像精确指定名称一样使用此文件。

搜索的目录包括几个标准系统目录以及您使用-L指定的任何目录。

通常,以这种方式找到的文件都是库文件--成员是目标文件的归档文件。 链接器通过扫描它的成员来处理存档文件,以查找定义到目前为止已引用但未定义的符号。 但是,如果找到的文件是普通的目标文件,则会以通常的方式链接它。 使用-l选项和指定文件名之间的唯一区别在于,-l用'lib'和'.a'将库括起来,并搜索几个目录。

因此,您必须首先放置-L/库目录,以便编译器知道包含库的目录,然后才能使用-llibrary标志。

感谢@MBR!问题已经通过@janneb上面的评论解决了。 - Randel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接