You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ubuntu 18.04下G++编译出现ATL系列函数未定义引用错误

解决Ubuntu 18.04下g++编译依赖BLAS/LAPACK/ATLAS程序的未定义引用错误

你在Ubuntu 18.04 Bionic Beaver系统上编译依赖BLAS/LAPACK与ATLAS库的程序时,遇到了如下链接错误:

/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libcblas.a(cblas_dsymm.o): In function `cblas_dsymm': (.text+0x1c0): undefined reference to `ATL_dsymm' 
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libcblas.a(cblas_dsyr2k.o): In function `cblas_dsyr2k': (.text+0x219): undefined reference to `ATL_dsyr2k' 
/usr/lib/gcc/x86_64-linux-gnu/7/../../../x86_64-linux-gnu/libcblas.a(cblas_dger.o): In function `cblas_dger': (.text+0x112): undefined reference to `ATL_dger' 
...(剩余错误省略)

这些错误的核心原因是链接器找不到ATLAS库提供的BLAS函数实现——libcblas作为BLAS的C接口封装,本身并不包含具体的函数代码,它需要依赖底层的ATLAS库来提供实现,而你编译时没正确链接这个库。

下面是具体的解决步骤:

1. 确认ATLAS开发库已安装

首先确保系统里已经安装了ATLAS的开发包(包含头文件和库文件),执行以下命令:

sudo apt-get update && sudo apt-get install libatlas-base-dev

这个包会同时安装ATLAS、BLAS和LAPACK的相关库,完全满足你的程序依赖需求。

2. 调整编译命令的链接参数

g++链接时,需要明确指定要链接的库,而且库的顺序很关键——依赖的库要放在源文件/目标文件之后。假设你的源文件是main.cpp,编译命令应该改成:

g++ main.cpp -o my_program -lcblas -latlas

如果是用Makefile管理编译,要把链接参数放在目标规则的末尾,比如:

my_program: main.o
	g++ main.o -o my_program -lcblas -latlas

这里-lcblas链接C接口的BLAS库,-latlas链接ATLAS的底层实现库,顺序不能搞反,否则链接器还是会找不到符号。

3. (可选)用pkg-config自动获取链接参数

如果记不清具体的库名,可以用pkg-config工具自动生成正确的链接参数,避免手动输入出错:

g++ main.cpp -o my_program $(pkg-config --libs atlas)

执行pkg-config --libs atlas会输出ATLAS库的完整链接参数,直接嵌入编译命令即可。

错误原因补充

你看到的错误里,libcblas.a中的函数调用了ATL_xxx开头的函数,这些都是ATLAS库提供的底层优化实现。如果只链接libcblas而不链接libatlas,链接器就无法找到这些函数的具体代码,从而抛出未定义引用的错误。


内容的提问来源于stack exchange,提问作者Covich

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 07:23:31