链接LAPACK / BLAS库

时间:2010-05-10 08:31:56

标签: c linker fortran77 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)

问题:
只有一些例程的未定义引用和外观顺序的相关原因可能是什么原因?

3 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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