1

背景:
我正在开发一个混合使用 C 和 Fortran 77 编写的项目,现在需要将 LAPACK/BLAS 库链接到项目(全部在 Linux 环境中)。有问题的 LAPACK 是来自 netlib.org 的 3.2.1 版(包括 BLAS)。这些库是使用顶级 Makefile 编译的(make lapacklib 和 make blaslib)。

问题:
在链接期间,错误消息声称从 LAPACK 例程调用的某些(不是全部)BLAS 例程未定义。这让我有些头疼,但是当(在 Makefile 中)要链接的库的出现顺序发生更改时,问题最终得到了解决。

代码:
在下面,(a)给出错误,而(b)没有。链接由(c)执行。
(a) LIBS = $(LAPACK)/blas_LINUX.a $(LAPACK)/lapack_LINUX.a
(b) LIBS = $(LAPACK)/lapack_LINUX.a $(LAPACK)/blas_LINUX.a
(c) gcc -Wall -O -o $@ project.o project.a $(LIBS)

问题:
仅某些例程的未定义引用可能是什么原因以及使出现顺序相关的原因是什么?

4

3 回答 3

1

LAPACK 库需要来自 BLAS 的东西,链接器从左到右搜索。因此,将 BLAS 放在 LAPACK 之后(选项 (b)),奏效了。

如果您希望它始终工作,无论顺序如何,您都可以使用链接器组:

-Wl,--start-group $(LAPACK)/blas_LINUX.a $(LAPACK)/lapack_LINUX.a -Wl,--end-group

这告诉链接器循环遍历库,直到所有符号都得到解决(或者直到它注意到再次循环无济于事)。

于 2012-06-20T13:38:18.600 回答
0

clapack 是否用作 LAPACK 实现?如果没有,您可以尝试使用它。

于 2011-03-10T20:59:23.063 回答
0

通常,人们总是将“更基本/基本”的库放在“不太基本/基本”的右侧 - 即,链接器将在文件的右侧查找出现在所述文件中的函数的定义。据说现代链接器不再需要这样做,但这始终是一个好主意(就像您的情况一样)。我不确定为什么它只与几个例程有关。

于 2010-05-11T00:02:27.227 回答