链接LAPACK / BLAS库

背景:
我正在研究一个用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)

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

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

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

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

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

通常,总是将“更基础/基本”的库置于“不太基础/基本”的右侧 – 即,链接器将在文件的右侧查找出现在所述文件中的函数的定义。 据说现代链接器不再需要它,但它总是一个好主意(如你的情况)。 我不确定为什么它只涉及几个例程。

clapack用作LAPACK实现吗? 如果没有,你可以尝试使用它。