背景:
我正在编写一个用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)问题:
只有一些例程的未定义引用的原因是什么,以及是什么使外观的顺序相关?
发布于 2012-06-20 13:38:18
LAPACK库需要来自BLAS的东西,链接器从左到右搜索。因此,在LAPACK (选项(b))之后使用BLAS是有效的。
如果希望它始终工作,不管顺序如何,可以使用链接器组:
-Wl,--start-group $(LAPACK)/blas_LINUX.a $(LAPACK)/lapack_LINUX.a -Wl,--end-group这告诉链接器循环遍历库,直到所有符号都被解析为止(或者直到它注意到循环不会有帮助)。
发布于 2010-05-11 00:02:27
通常,人们总是将“更基本/基本”库放在“不太基本/基本”的右侧,即链接器将查找文件的右侧,以定义出现在该文件中的函数。对于现代的链接器来说,这被认为不再是必要的了,但是它总是一个好主意(就像你的例子)。我不知道为什么它只与几个例行公事有关。
发布于 2011-03-10 20:59:23
clapack是否用作LAPACK实现?如果没有,你可以试着用它。
https://stackoverflow.com/questions/2801297
复制相似问题