2011-08-24 68 views
4

我试图做一些软件的发布,目前正在通过构建过程的脚本工作。我被困在了一些我从未想过的事情上,在x86_64 linux上静态链接LAPACK。在配置AC_SEARCH_LIB([main],[lapack])工程,但编译的lapack单位不起作用,例如undefiend reference to 'dsyev_' - nolapack/blas例程不被注意。静态链接反对LAPACK

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

下面是我在我的LAPACK第一次的经验,几年前使用的例子是动态的作品,而不是静态地:http://pastebin.com/cMm3wcwF

这两种方法我使用的编译有以下几种,

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

回答

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可以在链接共享库或对象文件时检测到循环依赖关系的情况下进行重新排序。但是静态库只能解析一次未知符号。

+0

真的,我可以发誓我已经读过,通过我昨晚/今天的搜索,现代连接器将重新排序。这有效,但它似乎无法找到我的blas例程 - 甚至w /'-lblas'。干杯。 – nlucaroni

+0

其他图书馆必须为此完全运作,'-llapack -lblas -lgfortran -lm'。 – nlucaroni

+0

链接器将尝试调整链接顺序以满足活动依赖关系的图形。但是,连接语句仍然是“从左到右”读取的,如果您指定了一个在当前集合中没有依赖关系的库,它就会被跳过。这是我在这里发生的事情。 – talonmies