如何通过CMake使用指定版本Eigen 3.3.7编译Ceres 1.13?
解决Ceres 1.13编译时指定Eigen 3.3.7的方法
核心思路
直接通过CMake参数强制指定Eigen 3.3.7的头文件路径,跳过系统默认的Eigen查找逻辑,避免版本冲突。
具体操作步骤
1. 准备Eigen 3.3.7
- Eigen是纯头文件库,无需编译安装,直接解压源码即可使用:
- 下载Eigen 3.3.7源码包并解压到任意目录(比如
~/local/eigen-3.3.7) - 确认解压目录下存在
Eigen/Core文件,这是头文件的根目录
- 下载Eigen 3.3.7源码包并解压到任意目录(比如
- 如果已经通过CMake安装到独立目录(比如
/opt/eigen3.3.7),则确认路径/opt/eigen3.3.7/include/eigen3/Eigen/Core存在,后续需要用这个/opt/eigen3.3.7/include/eigen3作为头文件路径。
2. 配置Ceres的CMake编译环境
- 创建Ceres源码的build目录并进入:
mkdir ceres-build && cd ceres-build - 执行CMake命令,强制指定Eigen 3.3.7的路径:
- 如果用解压的源码目录:
cmake /path/to/ceres-source -DEIGEN_INCLUDE_DIR=~/local/eigen-3.3.7 -DCMAKE_BUILD_TYPE=Release - 如果用已安装的独立目录:
cmake /path/to/ceres-source -DEIGEN_INCLUDE_DIR=/opt/eigen3.3.7/include/eigen3 -DCMAKE_BUILD_TYPE=Release
- 如果用解压的源码目录:
- 查看CMake输出,确认
Found Eigen的路径和版本是3.3.7,而非系统的3.4.0
3. 编译Ceres
- 执行编译命令:
make -j$(nproc)
为什么之前的方法失效?
- 复制
FindEigen.cmake属于多余操作,Ceres的CMake脚本本身支持直接指定EIGEN_INCLUDE_DIR参数,无需修改查找脚本 CMAKE_PREFIX_PATH或CMAKE_MODULES_PATH会让CMake优先查找系统已安装的配置文件,容易被系统的Eigen 3.4.0覆盖- 直接指定
EIGEN_INCLUDE_DIR会强制Ceres使用指定路径的头文件,彻底绕开系统版本的干扰
内容的提问来源于stack exchange,提问作者BillThePlatypus
相关产品推荐
相关产品推荐

