Building ceres-solver fail with eigen3 "error: no type named ‘Literal’ in ‘struct Eigen::NumTraits"

以前编译ceres-solver没有出现过问题,最近在编译时报出一个问题:

[ 75%] Building CXX object internal/ceres/CMakeFiles/jet_test.dir/jet_test.cc.o
In file included from /usr/local/include/eigen3/Eigen/Core:348:0,
                 from /home/ubuntu/cartographer/ceres-solver-1.11.0/include/ceres/jet.h:165,
                 from /home/ubuntu/cartographer/ceres-solver-1.11.0/internal/ceres/jet_test.cc:31:
/usr/local/include/eigen3/Eigen/src/Core/util/XprHelper.h: In instantiation of ‘struct Eigen::internal::promote_scalar_arg<ceres::Jet<double, 2>, Eigen::Matrix<ceres::Jet<double, 2>, 2, 2>, false>’:
/usr/local/include/eigen3/Eigen/src/plugins/CommonCwiseBinaryOps.h:50:1:   required by substitution of ‘template<class T> typename Eigen::internal::enable_if<true, const Eigen::CwiseBinaryOp<Eigen::internal::scalar_product_op<typename Eigen::internal::promote_scalar_arg<ceres::Jet<double, 2>, T, Eigen::internal::has_ReturnType<Eigen::ScalarBinaryOpTraits<T, ceres::Jet<double, 2>, Eigen::internal::scalar_product_op<T, ceres::Jet<double, 2> > > >::value>::type, ceres::Jet<double, 2> >, const typename Eigen::internal::plain_constant_type<Eigen::Matrix<ceres::Jet<double, 2>, 2, 1, 0, 2, 1>, typename Eigen::internal::promote_scalar_arg<ceres::Jet<double, 2>, T, Eigen::internal::has_ReturnType<Eigen::ScalarBinaryOpTraits<T, ceres::Jet<double, 2>, Eigen::internal::scalar_product_op<T, ceres::Jet<double, 2> > > >::value>::type>::type, const Eigen::
### 关于 Ceres Solver 编译失败的原因分析 Ceres Solver 是 Google 开源的一个强大的非线性优化库,它广泛应用于机器人学、计算机视觉等领域。然而,在构建过程中可能会遇到各种问题,尤其是当涉及多个第三方依赖库(如 Eigen 和 G2O)时。 #### 1. **错误原因** 在尝试构建 Ceres-Solver 的过程中,如果出现了 `no type namedLiteral’` 这样的错误,则通常是因为版本不匹配引起的。具体来说: - Ceres 使用了 Eigen 库中的某些特性来实现自动求导功能。这些特性可能仅存在于特定版本的 Eigen 中。 - 如果使用的 Eigen 版本较旧或者不符合 Ceres 所需的要求,则可能导致此类编译错误[^1]。 #### 2. **解决方案** ##### (1)确认并更新 Eigen 版本 确保所使用的 Eigen 版本是最新的稳定版。可以通过以下命令安装最新版本的 Eigen: ```bash sudo apt-get update sudo apt-get install libeigen3-dev ``` 验证当前系统的 Eigen 版本是否满足需求: ```cpp #include <Eigen/Dense> #include <iostream> int main() { std::cout << "Eigen Version: " << EIGEN_WORLD_VERSION << "." << EIGEN_MAJOR_VERSION << "." << EIGEN_MINOR_VERSION << std::endl; } ``` 运行上述代码可以打印出当前系统上的 Eigen 版本号。对于 Ceres 来说,推荐使用至少 3.3 或更高版本的 Eigen。 ##### (2)调整 Ceres 配置选项 有时即使升级了 Eigen,仍然会因为默认配置导致冲突。可以在 Ceres 构建之前通过修改其 CMake 参数禁用不必要的组件。例如: ```bash cmake .. \ -DBUILD_TESTING=OFF \ -DCMAKE_BUILD_TYPE=Release \ -DEIGENSPARSE=ON \ -DSUITESPARSE=OFF ``` 这里的关键参数 `-DEIGENSPARSE=ON` 表示强制启用 Sparse 功能支持,而关闭其他潜在引起冲突的功能模块。 ##### (3)重新克隆仓库并清理环境变量 由于引用提到 checkout 失败的情况[^2],可能是本地 Git 存储库损坏或者是网络连接不稳定造成的。建议删除现有目录后再次拉取官方存储库: ```bash rm -rf ceres-solver/ git clone --recursive https://ceres-solver.googlesource.com/ceres-solver cd ceres-solver && mkdir build && cd build cmake .. make -j$(nproc) sudo make install ``` 注意:务必加上 `--recursive` 参数以同步子模块内容。 #### 3. **进一步调试技巧** 如果以上操作仍无法解决问题,可考虑逐步排查: - 查看完整的编译日志文件,定位具体的报错位置; - 修改 Ceres 源码中涉及到 `Jet<double>` 类型定义的部分,手动添加缺失类型的声明作为临时修复方案; - 参考社区讨论区是否有类似案例及其对应的补丁程序。 --- ### 提供一段简单的测试代码用于验证环境设置正确与否 下面是一段利用 Ceres 实现基本最小二乘法拟合直线的例子: ```cpp #include <ceres/ceres.h> #include <iostream> struct CostFunctor { template <typename T> bool operator()(const T* const m, const T* const c, T* residual) const { *residual = T(1.0)*m + T(1.0)*c - T(2.0); return true; } }; int main() { double initial_m = 0.5, initial_c = 0.5; ceres::Problem problem; problem.AddResidualBlock(ceres::AutoDiffCostFunction<CostFunctor, 1, 1, 1>(new CostFunctor), nullptr, &initial_m, &initial_c); ceres::Solver::Options options; options.linear_solver_type = ceres::DENSE_QR; ceres::Solver::Summary summary; ceres::Solve(options, &problem, &summary); std::cout << summary.BriefReport() << "\nm=" << initial_m << ", c=" << initial_c << std::endl; } ``` 成功执行该脚本意味着开发环境中已妥善解决了所有必要的依赖关系。 ---
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值