【问题标题】:Statically linking against LAPACK针对 LAPACK 静态链接
【发布时间】:2015-04-30 00:10:27
【问题描述】:

我正在尝试发布一些软件,目前正在编写构建过程的脚本。我被困在我从未想过的事情上,在 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

【问题讨论】:

    标签: c linker compilation lapack blas


    【解决方案1】:

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

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

    这应该可以解决链接问题。


    为了回答后面的问题为什么这样有效,GNU ld 文档这样说:

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

    ........

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

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

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

    【讨论】:

    • 真的,我可以发誓我已经阅读,通过我昨晚/今天的搜索,现代链接器将重新排序它们。这行得通,但它现在似乎找不到我的 blas 例程——即使 w/-lblas。干杯。
    • 为了使其充分发挥作用所必需的其他库,-llapack -lblas -lgfortran -lm
    • 链接器将尝试调整链接顺序以满足活动依赖关系图。但是链接语句仍然是“从左到右”读取的,如果你指定了一个在当前集合中没有依赖关系的库,它就会被跳过。这就是我在这里发生的事情。
    • 你是什么意思,“在当前集合中没有依赖”?有依赖,我的程序依赖。
    • 但是你的程序在指定库的时候还没有编译成对象(记住,读“从左到右”),所以跳过了。
    猜你喜欢
    • 1970-01-01
    • 2011-11-02
    • 2012-12-29
    • 2012-05-09
    • 2014-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多