2013-12-18 44 views
6

我安装在Ubuntu LAPACK通过以下the instructiongfortran LAPACK “未定义参考” 错误

sudo 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有什么问题吗?非常感谢!

+5

尝试将链接命令(即-llapack -lblas)*放在要编译的文件的名称后面。否则,链接器可能会尝试按错误顺序解析符号。 – janneb

+1

非常感谢@janneb!它确实有用! – Randel

回答

5

gcc/gfortran documentation

-llibrary-l 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标志。

+0

谢谢@MBR!上面的@ janneb的评论解决了这个问题。 – Randel