Eigen3调用inverse()编译时出现undefined reference错误如何解决
问题解决方法
undefined reference报错的核心原因是找不到Eigen::MatrixBase::inverse()的实现,由以下几个常见问题导致:
1. 头文件引用不全
Eigen的核心模块Eigen/Core仅包含基础矩阵定义、基础算术运算接口,矩阵求逆属于LU分解模块的功能,被统一封装在Eigen/Dense头文件中。
修复方法:将代码中的头文件引用
#include<Eigen/Core>
替换为
#include<Eigen/Dense>
2. CMake配置写法不规范
旧版CMake的include_directories写法容易出现头文件路径优先级冲突问题,Eigen3提供了官方导入目标,直接链接即可自动处理头文件路径。
修复方法:将CMakeLists.txt替换为以下内容:
cmake_minimum_required(VERSION 3.10 FATAL_ERROR) project(test) # 优先使用官方Eigen3配置文件,避免兼容问题,指定最低版本为3.3 find_package(Eigen3 3.3 REQUIRED NO_MODULE) add_executable(test test.cpp) # 直接链接官方导入目标,自动添加头文件路径 target_link_libraries(test Eigen3::Eigen)
3. 多版本Eigen冲突
CUDA安装时会自带一份Eigen副本,默认路径为/usr/local/cuda/include/Eigen,如果find_package优先匹配到CUDA自带的Eigen版本,会和你需要的3.3.9版本出现符号不匹配。
排查与修复方法:
- 在CMakeLists.txt中添加一行日志输出,确认找到的Eigen版本和路径:
执行cmake配置时查看输出,如果路径指向CUDA目录,执行cmake时手动指定目标Eigen3的配置文件路径:message(STATUS "Eigen3版本: ${EIGEN3_VERSION}, 路径: ${EIGEN3_INCLUDE_DIRS}")
如果你是自行编译安装的Eigen3.3.9,将路径替换为你安装路径下的cmake .. -DEigen3_DIR=/usr/lib/cmake/eigen3share/eigen3/cmake目录即可。
内容的提问来源于stack exchange,提问作者catmulti7
相关产品推荐
相关产品推荐

