c - 链接 LAPACK/BLAS 库

标签 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)

问题:
仅某些例程的 undefined reference 可能是什么原因以及出现顺序相关的原因是什么?

最佳答案

LAPACK 库需要来自 BLAS 的内容,链接器从左到右搜索。因此,将 BLAS 放在 LAPACK 之后(选项 (b)),是可行的。

如果您希望它始终有效,而不管顺序如何,您可以使用链接器组:

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

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

关于c - 链接 LAPACK/BLAS 库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2801297/

相关文章:

c - 在 C 中打印阿姆斯特朗数

c++ - 无法在 VScode (macOS) 中将头文件链接到我的 main.cpp(clang 错误)

gcc 配置选项说明

fortran - F77 : problem to compile with g77 a program which was normally compiled with Absoft compiler

linux - 错误 : 'b' argument of 'sign' intrinsic at (1) must be the same type and kind as 'a'

c - 如何在 Mac 终端上将数组输入到 C 程序中?

c - 多对一网守任务同步

c - fscanf 计数 "invisible"个空格

c++ - vulkan vkresult 链接器错误 msvc

c - 在 Fortran77 子例程中传递 C 指针