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
相关产品推荐
相关产品推荐

