静态链接LAPACK

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

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

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

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

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

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

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

这应解决联系问题。


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

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

……..

通常,以这种方式找到的文件是库文件 – 归档文件,其成员是目标文件。 链接器通过扫描存档文件来处理存档文件,以查找已定义但尚未定义的符号的成员。 但是,如果找到的文件是普通的目标文件,则以通常的方式链接。

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

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