Ubuntu20.04下Ceres1.14的安装与验证:从依赖配置到测试运行
1. 环境准备与依赖安装
在Ubuntu 20.04上安装Ceres Solver 1.14之前,我们需要先配置好基础环境。这个环节就像盖房子前打地基,缺一不可。我遇到过不少因为依赖缺失导致的编译失败案例,所以特别整理了这份详细清单。
首先更新软件源索引,这个操作相当于刷新本地软件目录:
sudo apt update sudo apt upgrade -y接下来安装核心数学计算库,这些是Ceres进行非线性优化的基础组件:
sudo apt install -y liblapack-dev libsuitesparse-dev libcxsparse3.1.4 \ libgflags-dev libgoogle-glog-dev libgtest-dev这里有个容易踩坑的地方:不同Ubuntu版本对应的libcxsparse版本号可能不同。我在20.04上实测发现3.1.4才是正确的版本,如果按老教程安装3.1.2会导致后续编译报错。安装完成后建议用ls /usr/lib/x86_64-linux-gnu/检查是否存在libcxsparse.so文件。
2. 源码获取与编译配置
现在进入正式的安装环节。我推荐从源码编译安装而不是直接apt安装,这样可以确保获得1.14特定版本,也方便后续调试。
首先下载官方源码包(建议用国内镜像加速):
wget https://ceres-solver.org/ceres-solver-1.14.0.tar.gz tar xvf ceres-solver-1.14.0.tar.gz cd ceres-solver-1.14.0创建编译目录是Cmake项目的标准做法,可以保持源码目录干净:
mkdir build cd build关键配置步骤来了,这里有几个优化参数值得注意:
cmake .. -DCMAKE_BUILD_TYPE=Release \ -DBUILD_EXAMPLES=OFF \ -DBUILD_TESTING=OFF解释下这几个参数:
BUILD_TYPE=Release开启编译器优化- 关闭示例和测试编译可以加快速度
- 如果要用Python接口,需要额外加
-DBUILD_PYTHON_BINDINGS=ON
3. 编译与安装过程
编译阶段最耗时间,这里有几个实用技巧:
make -j$(nproc)-j$(nproc)会自动检测CPU核心数并行编译,我的8核机器上编译时间从15分钟缩短到3分钟。编译过程中如果出现内存不足,可以适当减少并行数,比如-j4。
安装到系统目录需要管理员权限:
sudo make install安装完成后,Ceres会被默认安装到/usr/local/下。可以通过以下命令验证:
ls /usr/local/include/ceres ls /usr/local/lib/libceres.a4. 验证安装的正确性
安装完成不是终点,验证能正常工作才最关键。我准备了一个最小测试案例,这个例子求解一个简单的最优化问题:找到使10-x=0成立的x值。
创建项目目录结构:
ceres_test/ ├── CMakeLists.txt └── ceres_example.cppCMakeLists.txt内容如下(注意版本要求):
cmake_minimum_required(VERSION 3.10) project(ceres_test) find_package(Ceres REQUIRED) include_directories(${CERES_INCLUDE_DIRS}) add_executable(ceres_test ceres_example.cpp) target_link_libraries(ceres_test ${CERES_LIBRARIES})测试代码ceres_example.cpp直接使用官网示例,但增加了更多输出信息:
#include <iostream> #include <ceres/ceres.h> class CostFunctor { public: template <typename T> bool operator()(const T* const x, T* residual) const { residual[0] = T(10.0) - x[0]; return true; } }; int main() { double x = 0.5; ceres::Problem problem; ceres::CostFunction* cost_function = new ceres::AutoDiffCostFunction<CostFunctor, 1, 1>(new CostFunctor); problem.AddResidualBlock(cost_function, nullptr, &x); ceres::Solver::Options options; options.minimizer_progress_to_stdout = true; ceres::Solver::Summary summary; std::cout << "Initial x: " << x << std::endl; Solve(options, &problem, &summary); std::cout << summary.BriefReport() << "\n"; std::cout << "Final x: " << x << std::endl; return 0; }编译和运行测试:
mkdir build && cd build cmake .. make ./ceres_test成功运行的输出应该显示优化过程,最终x值会接近10。如果看到类似下面的输出,说明安装成功:
iter cost cost_change |gradient| |step| tr_ratio tr_radius ls_iter iter_time total_time 0 4.512500e+01 0.00e+00 9.50e+00 0.00e+00 0.00e+00 1.00e+04 0 5.06e-05 1.67e-04 1 4.511598e-07 4.51e+01 9.50e-04 9.50e+00 1.00e+00 3.00e+04 1 1.10e-04 3.13e-04 2 5.012552e-16 4.51e-07 3.17e-08 9.50e-04 1.00e+00 9.00e+04 1 4.03e-05 3.64e-04 Final x: 105. 常见问题排查
在实际安装过程中可能会遇到各种问题,这里分享几个典型case的解决方案:
问题1:找不到SuiteSparse
CMake Error at CMakeLists.txt:xxx (find_package): Could not find a package configuration file provided by "SuiteSparse"...解决方法:安装缺失的依赖
sudo apt install libsuitesparse-dev问题2:GLIBCXX版本不兼容
/usr/lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.26' not found这是因为gcc版本太旧,需要更新:
sudo apt install gcc-9 g++-9 sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 9问题3:内存不足导致编译失败在内存较小的机器上编译可能出现编译器被kill的情况。解决方法:
make -j2 # 减少并行编译任务数6. 性能优化建议
要让Ceres发挥最佳性能,有几个配置技巧值得注意:
线性求解器选择:
DENSE_QR:适合小规模问题(参数<几百)SPARSE_NORMAL_CHOLESKY:大规模稀疏问题首选CGNR:内存受限时的选择
多线程加速: 在CMake配置时开启OpenMP:
cmake .. -DOPENMP=ON内存管理: 对于超大问题,可以设置:
options.num_threads = 4; options.linear_solver_ordering = nullptr;
7. 卸载与版本管理
如果需要卸载Ceres,执行以下命令即可:
sudo rm -rf /usr/local/lib/cmake/Ceres sudo rm -rf /usr/local/include/ceres sudo rm -f /usr/local/lib/libceres*对于多版本管理需求,我推荐使用checkinstall工具生成deb包:
sudo apt install checkinstall cd build sudo checkinstall这样可以通过dpkg来管理安装和卸载,还能保留安装记录。
