C++使用Armadillo库执行矩阵乘法出现链接报错如何解决?
问题描述
用户想要在C++中基于Armadillo库实现简单矩阵乘法,编译时报链接错误,用户代码如下:
#include <iostream> #include <armadillo> using namespace std; using namespace arma; int main() { mat B(5, 10, fill::randu); mat C(10, 5, fill::randu); mat U = B * C; return 0; }
报错信息如下:
/usr/bin/ld: /tmp/ccA4Cqsm.o: in function `TLS wrapper function for arma::arma_rng_cxx11_instance': main.cpp:(.text._ZTWN4arma23arma_rng_cxx11_instanceE[_ZTWN4arma23arma_rng_cxx11_instanceE]+0x25): undefined reference to `arma::arma_rng_cxx11_instance' /usr/bin/ld: /tmp/ccA4Cqsm.o: in function `void arma::blas::gemv<double>(char const*, int const*, int const*, double const*, double const*, int const*, double const*, int const*, double const*, double*, int const*)': main.cpp:(.text._ZN4arma4blas4gemvIdEEvPKcPKiS5_PKT_S8_S5_S8_S5_S8_PS6_S5_[_ZN4arma4blas4gemvIdEEvPKcPKiS5_PKT_S8_S5_S8_S5_S8_PS6_S5_]+0x57): undefined reference to `wrapper2_dgemv_' /usr/bin/ld: /tmp/ccA4Cqsm.o: in function `void arma::blas::gemm<double>(char const*, char const*, int const*, int const*, int const*, double const*, double const*, int const*, double const*, int const*, double const*, double*, int const*)': main.cpp:(.text._ZN4arma4blas4gemmIdEEvPKcS3_PKiS5_S5_PKT_S8_S5_S8_S5_S8_PS6_S5_[_ZN4arma4blas4gemmIdEEvPKcS3_PKiS5_S5_PKT_S8_S5_S8_S5_S8_PS6_S5_]+0x63): undefined reference to `wrapper2_dgemm_' collect2: error: ld returned 1 exit status
报错原因
这是典型的链接阶段错误,你的代码本身语法没有问题,错误来源于编译时没有正确链接Armadillo库及其依赖的BLAS、LAPACK线性代数库,导致链接器找不到Armadillo的内置随机数实例、矩阵乘法接口等核心符号。
解决方案
- 单文件直接编译时,在编译命令末尾添加链接Armadillo库的参数即可,假设你的源文件名为
main.cpp,正确编译命令如下:
g++ main.cpp -o matrix_mul -larmadillo
- 若执行上述命令仍报相同错误,说明你的系统中安装的Armadillo未将BLAS、LAPACK依赖合并,需要手动链接这两个基础线性代数库:
g++ main.cpp -o matrix_mul -larmadillo -lblas -llapack
- 若使用CMake构建项目,需要在
CMakeLists.txt中添加Armadillo的查找和链接配置,示例配置如下:
cmake_minimum_required(VERSION 3.10) project(matrix_mul) # 查找Armadillo依赖 find_package(Armadillo REQUIRED) include_directories(${ARMADILLO_INCLUDE_DIRS}) add_executable(matrix_mul main.cpp) # 链接Armadillo相关库 target_link_libraries(matrix_mul ${ARMADILLO_LIBRARIES})
- 若仍报错,先检查Armadillo开发包是否正确安装:
- Debian/Ubuntu系列系统执行:
sudo apt install libarmadillo-dev - CentOS/RHEL/Fedora系列系统执行:
sudo dnf install armadillo-devel - 源码编译安装的Armadillo需要在编译时额外指定库搜索路径,比如你将Armadillo安装在
/opt/armadillo路径下,编译命令修改为:
g++ main.cpp -o matrix_mul -L/opt/armadillo/lib -I/opt/armadillo/include -larmadillo -lblas -llapack - Debian/Ubuntu系列系统执行:
内容的提问来源于stack exchange,提问作者arash rezaei
相关产品推荐
相关产品推荐

