我按照说明在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有什么问题吗?非常感谢!
请参阅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/directory/of/the/library
以便编译器知道包含您的库的目录,然后是-llibrary
标志.