如何在ROS包中切换Eigen版本至指定稳定版3.3.4
解决ROS包中指定Eigen 3.3.4版本的问题
我来帮你一步步搞定这个版本切换的问题——本质上是ROS自带的高版本Eigen(3.3.90)优先被CMake找到了,而你手动安装的3.3.4被忽略了。下面是几个可靠的解决方案:
1. 先确认系统中的Eigen分布
首先搞清楚你系统里有哪些Eigen版本,分别在什么路径:
# 查找所有Eigen相关路径 find /usr -name "Eigen" -type d # 查看/usr/local下的Eigen版本 cat /usr/local/include/eigen3/Eigen/src/Core/util/Macros.h | grep -E "(EIGEN_MAJOR|MINOR|PATCH)_VERSION" # 再看看ROS自带的Eigen版本 cat /usr/include/eigen3/Eigen/src/Core/util/Macros.h | grep -E "(EIGEN_MAJOR|MINOR|PATCH)_VERSION"
这一步能确认你确实已经装好了3.3.4在/usr/local,而系统默认用的是/usr/include下的3.3.90。
2. 方案一:在你的ROS包CMakeLists.txt中强制指定Eigen路径
因为Eigen是纯头文件库,不需要链接库文件,直接指定include目录就能绕过CMake的默认查找逻辑:
- 先注释掉原来的
find_package(Eigen3 REQUIRED)之类的语句 - 添加以下代码(放在
include_directories的最前面,确保优先级最高):# 强制指定我们要的Eigen 3.3.4的路径 set(EIGEN3_INCLUDE_DIR "/usr/local/include/eigen3") include_directories(${EIGEN3_INCLUDE_DIR}) - 重新编译你的包:
catkin_make或者catkin build
3. 方案二:用find_package的PATHS参数强制指定版本
如果你还是想保留find_package的方式,可以用EXACT和PATHS参数让CMake优先找你安装的版本:
# 精确查找3.3.4版本,指定cmake配置文件的路径 find_package(Eigen3 3.3.4 EXACT REQUIRED PATHS "/usr/local/share/eigen3/cmake") include_directories(${EIGEN3_INCLUDE_DIR})
这里的/usr/local/share/eigen3/cmake是你安装Eigen 3.3.4时生成的CMake配置文件路径,sudo make install会自动生成这些文件。
4. 方案三:临时修改CMake查找优先级(全局临时生效)
如果你只是临时测试,不想改CMakeLists.txt,可以在编译前设置环境变量,让CMake优先查找/usr/local的内容:
# 临时修改CMake前缀路径,让/usr/local优先 export CMAKE_PREFIX_PATH="/usr/local:$CMAKE_PREFIX_PATH" # 然后编译你的工作空间 catkin_make -DCMAKE_PREFIX_PATH="/usr/local:$CMAKE_PREFIX_PATH"
5. 验证版本是否切换成功
在你的ROS包代码里加一段测试代码,编译运行后看输出:
#include <Eigen/Core> #include <iostream> int main(int argc, char** argv) { std::cout << "当前Eigen版本:" << EIGEN_MAJOR_VERSION << "." << EIGEN_MINOR_VERSION << "." << EIGEN_PATCH_VERSION << std::endl; return 0; }
运行后如果输出3.3.4就说明成功了。
注意事项
- 不要全局替换系统的Eigen版本!ROS的很多核心包(比如tf2、moveit)可能依赖高版本Eigen,全局替换会导致这些包编译失败。我们只在自己的包中指定版本就好。
- 如果编译时出现头文件冲突,检查你的
include_directories顺序,确保/usr/local/include/eigen3在/usr/include/eigen3之前。
内容的提问来源于stack exchange,提问作者MichalSzczep
相关产品推荐
相关产品推荐

