nlu*_*oni 4 c linker compilation blas lapack
我正在尝试发布一些软件,目前正在编写构建过程的脚本.我陷入了一些我从未想过会发生的事情,在x86_64 linux上静态链接LAPACK.在配置AC_SEARCH_LIB([main],[lapack])工作期间,但是lapack单元的编译不起作用,例如undefiend reference to 'dsyev_'--no lapack/blas例程不被注意.
我已经确认我已经安装了库,甚至自己用适当的选项编译它们,使它们具有相同的结果.
这是我几年前第一次使用LAPACK时使用的一个例子,它可以动态地工作,但不是静态工作:http://pastebin.com/cMm3wcwF
我用来编译的两个方法如下,
gcc -llapack -o eigen eigen.c
gcc -static -llapack -o eigen eigen.c
Run Code Online (Sandbox Code Playgroud)
您的链接顺序错误.在需要它们的代码之后链接库,而不是之前.像这样:
gcc -o eigen eigen.c -llapack
gcc -static -o eigen eigen.c -llapack
Run Code Online (Sandbox Code Playgroud)
这应解决联系问题.
为了回答随后的问题,为什么会这样,GNU ld文档说:
它在您编写此选项的命令中有所不同; 链接器按照指定的顺序搜索和处理库和目标文件.因此,
foo.o -lz bar.o' searches libraryz'在文件foo.o之后但在bar.o之前.如果bar.o引用"z"中的函数,则可能无法加载这些函数.........
通常,以这种方式找到的文件是库文件 - 归档文件,其成员是目标文件.链接器通过扫描存档文件来处理存档文件,以查找已定义但尚未定义的符号的成员.但是,如果找到的文件是普通的目标文件,则以通常的方式链接.
即.链接器将通过一个文件查找未解析的符号,并按照您提供的顺序跟踪文件(即"从左到右").如果在读取文件时尚未指定依赖关系,则链接器将无法满足依赖关系.链接列表中的每个对象仅解析一次.
另请注意,在链接共享库或目标文件时,如果检测到循环依赖关系,GNU ld可以进行重新排序.但静态库只能解析一次未知符号.