链接LAPACK / BLAS库(Linking LAPACK/BLAS libraries)

2019-10-21 15:12发布

背景:
我正在写在C和Fortran 77的混合项目,现在需要的LAPACK / BLAS库链接到项目(所有在Linux环境中)。 有问题的LAPACK是netlib.org 3.2.1版本(包括BLAS)。 该库采用顶级的Makefile(请lapacklib并blaslib)编制。

问题:
在连接过程中的错误消息声称,某些(不是全部)BLAS例程从LAPACK例程称为是不确定的。 这给了我一些头痛,但是当(在Makefile)被链接库的出现顺序被改变最终解决了这个问题。

码:
在下文中,(a)是错误的,而(b)不。 所述连接是通过(c)中进行的。
(一)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)

题:
可能是什么只有一些例程的未定义引用的理由是什么使相关的出场顺序?

Answer 1:

该LAPACK库需要的东西从BLAS,并从链接搜索从左到右。 因此,把BLAS LAPACK(选项(B))后,工作。

如果你想让它总是工作,不分先后顺序的,你可以使用连接基:

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

这告诉链接器遍历库,直到所有的符号得到解决(或直到它注意到再次循环不会帮助)。



Answer 2:

通常人们总是放“更基本/基本的”库“少基本/基本”的权利 - 即,链接器将期待的出现在函数的定义文件的右侧表示文件。 推测这是没有必要的任何更多与现代链接,但它总是一个好主意(如你的情况)。 我不知道为什么它只有几个套路重要的。



Answer 3:

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



文章来源: Linking LAPACK/BLAS libraries