静态链接LAPACK

时间:2011-08-24 15:15:08

标签: c linker compilation lapack blas

我正在尝试发布一些软件,目前正在编写构建过程的脚本。我陷入了一些我从未想过会发生的事情,在x86_64 linux上静态链接LAPACK。在配置AC_SEARCH_LIB([main],[lapack])期间,但是lapack单元的编译不起作用,例如undefiend reference to 'dsyev_' - 没有lapack / blas例程被忽视。

我已经确认我已经安装了库,甚至自己使用适当的选项编译它们,以使它们具有相同的静态结果。

这是我几年前第一次使用LAPACK时使用的一个例子,它可以动态地工作,但不是静态的:http://pastebin.com/cMm3wcwF

我用来编译的两个方法如下,

gcc -llapack -o eigen eigen.c
gcc -static -llapack -o eigen eigen.c

1 个答案:

答案 0 :(得分:5)

您的关联订单错误。在需要它们的代码之后链接库,而不是之前。像这样:

gcc -o eigen eigen.c -llapack 
gcc -static -o eigen eigen.c -llapack

那应该解决联系问题。


为了回答随后的问题,为什么会这样,GNU ld文档会这样说:

  

在您编写此选项的命令中,它会有所不同;该   链接器按顺序搜索和处理库和目标文件   它们是指定的。因此,foo.o -lz bar.o' searches library z'之后   文件foo.o但在bar.o之前如果bar.o引用'z'中的函数,   这些功能可能无法加载。

     

........

     

通常这样找到的文件是库文件 - 存档文件   其成员是目标文件。链接器处理归档文件   通过它扫描定义到目前为止的符号的成员   被引用但未定义。但是,如果找到的文件是   普通的目标文件,它以通常的方式链接。

即。链接器将通过一个文件查找未解析的符号,并按照您提供的顺序跟踪文件(即“从左到右”)。如果在读取文件时尚未指定依赖关系,则链接器将无法满足依赖关系。链接列表中的每个对象只被解析一次。

另请注意,在链接共享库或目标文件时,如果检测到循环依赖关系,GNU ld可以进行重新排序。但静态库只能解析一次未知符号。

相关问题