我按照the instruction,
在Ubuntu上安装了LAPACKsudo apt-get install liblapack-dev
因此我可以找到/usr/lib/libblas/libblas.a
和/usr/lib/lapack/liblapack.a
,然后使用randomsys1
example在gfortran
中对其进行测试,
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有什么问题吗?非常感谢!
答案 0 :(得分:5)
请参阅gcc/gfortran documentation:
-llibrary
,-l library
链接时搜索名为library的库。 (第二种方法是将库作为单独的参数,仅适用于POSIX 合规,不推荐。)
在您编写此选项的命令中,它会有所不同;链接器搜索并处理库中的库和目标文件 他们是指定的。因此,'foo.o -lz bar.o'搜索库'z' 在文件foo.o之后但在bar.o之前如果bar.o指的是函数 'z',可能无法加载这些函数。
链接器搜索库的标准目录列表,该库实际上是名为liblibrary.a的文件。接着然后 使用此文件,就好像它已按名称精确指定一样。
搜索的目录包括几个标准系统目录以及您使用-L指定的任何目录。
通常,以这种方式找到的文件是库文件 - 归档文件,其成员是目标文件。链接器处理归档文件 通过它扫描定义到目前为止的符号的成员 被引用但未定义。但是,如果找到的文件是 普通的目标文件,它以通常的方式链接。唯一的 使用-l选项和指定文件名之间的区别是 -l用'lib'和'.a'包围库并搜索几个 目录。
所以你必须先放-L/directory/of/the/library
所以编译器知道包含你的库的目录,然后 -llibrary
标志。