我正在尝试发布一些软件,目前正在编写构建过程的脚本。我陷入了一些我从未想过会发生的事情,在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
答案 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可以进行重新排序。但静态库只能解析一次未知符号。