别再被CMake报错劝退!Ubuntu 20.04上ORB-SLAM3编译失败的三个关键修复点
攻克ORB-SLAM3编译难题:Ubuntu 20.04实战避坑指南
当你第一次尝试在Ubuntu 20.04上编译ORB-SLAM3时,那些令人窒息的CMake报错信息可能会让你怀疑人生。无数个make[2]: *** [CMakeFiles/ORB_SLAM3.dir/build.make...] 错误 1堆叠在终端里,就像一堵高墙挡在你和SLAM技术探索之间。但别担心,这些看似无解的编译错误背后,往往只是几个关键配置问题在作祟。
1. C++标准设置:被忽视的版本陷阱
Ubuntu 20.04默认的GCC编译器虽然支持C++14,但CMake并不会自动为你设置正确的标准版本。ORB-SLAM3的代码大量使用了C++14特性,当编译器以默认的C++11标准尝试编译时,就会在MLPnPsolver.cpp、Tracking.cc等文件中抛出各种语法错误。
修复方案有以下两种,任选其一即可:
在
ORB_SLAM3/CMakeLists.txt文件中添加:set(CMAKE_CXX_STANDARD 14)或者在同一个文件中添加编译选项:
add_compile_options(-std=c++14)
提示:修改CMakeLists后,务必删除之前的构建目录并重新运行
cmake,否则更改可能不会生效。
这个问题的本质在于不同Linux发行版对C++标准的默认支持策略不同。Ubuntu 18.04可能更宽松,而20.04则更严格。理解这一点后,你在其他项目遇到类似问题时就能举一反三。
2. OpenCV的pkg-config迷局:手动创建配置文件
当看到Package opencv was not found in the pkg-config search path这个错误时,很多人的第一反应是重新安装OpenCV。但实际上,问题出在OpenCV 4.x版本不再自动生成.pc文件,而ORB-SLAM3的构建系统又依赖这个文件来定位OpenCV。
分步解决方案:
创建pkgconfig目录(如果不存在):
sudo mkdir -p /usr/local/lib/pkgconfig创建并编辑opencv.pc文件:
sudo nano /usr/local/lib/pkgconfig/opencv.pc填入以下内容(根据你的OpenCV安装路径调整):
prefix=/usr/local exec_prefix=${prefix} includedir=${prefix}/include/opencv4 libdir=${exec_prefix}/lib Name: opencv Description: The opencv library Version:4.2.0 Cflags: -I${includedir} Libs: -L${libdir} -lopencv_calib3d -lopencv_core -lopencv_features2d -lopencv_flann -lopencv_highgui -lopencv_imgcodecs -lopencv_imgproc -lopencv_ml -lopencv_objdetect -lopencv_photo -lopencv_stitching -lopencv_video -lopencv_videoio更新pkg-config路径:
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH
这个问题的棘手之处在于,错误信息并没有明确指出是.pc文件缺失。通过理解pkg-config机制,你不仅能解决ORB-SLAM3的问题,还能应对其他依赖OpenCV的项目构建问题。
3. Eigen版本兼容性:内存不足设备的隐形杀手
在树莓派或Jetson等内存有限的设备上编译时,你可能会遇到编译过程卡死的情况。这通常是因为Eigen版本过高导致内存消耗过大,而不仅仅是警告信息那么简单。
优化方案对比:
| 方案 | 操作 | 优点 | 缺点 |
|---|---|---|---|
| 降级Eigen | sudo apt install libeigen3-dev=3.3.7-2 | 彻底解决问题 | 可能影响其他依赖新版本的项目 |
| 增加swap空间 | sudo fallocate -l 4G /swapfile | 不改变系统环境 | 只是临时解决方案 |
| 限制编译线程 | make -j2 | 简单易行 | 编译时间变长 |
对于大多数用户,我推荐使用Eigen 3.3.7版本:
sudo apt-get install libeigen3-dev=3.3.7-2 sudo apt-mark hold libeigen3-dev注意:hold操作会阻止该包被自动更新,确保版本稳定性。
4. 构建流程最佳实践:从源码到可执行文件
掌握了上述三个关键点后,让我们梳理一个完整的构建流程:
环境准备:
- 安装基础依赖:
sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
- 安装基础依赖:
源码获取与准备:
git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git ORB_SLAM3 cd ORB_SLAM3 chmod +x build.sh应用修复方案:
- 编辑CMakeLists.txt添加C++14支持
- 确保OpenCV的pkg-config配置正确
- 检查Eigen版本
构建与安装:
./build.sh
常见问题速查表:
| 错误现象 | 可能原因 | 快速检查方法 |
|---|---|---|
| 各种语法错误 | C++标准不匹配 | 检查CMakeLists中的CXX_STANDARD设置 |
| 找不到OpenCV | pkg-config问题 | 运行pkg-config --modversion opencv |
| 编译卡死 | 内存不足/Eigen问题 | 查看free -h和Eigen版本 |
5. 超越基础:高级调试技巧
当上述方案仍然不能解决问题时,你需要更深入的调试手段:
详细日志分析:
make VERBOSE=1这会显示完整的编译命令,帮助你定位确切的问题点。
单文件编译测试: 选择其中一个报错的源文件单独编译:
g++ -std=c++14 -I/path/to/includes -c src/MLPnPsolver.cpp依赖关系可视化(需要graphviz):
cmake --graphviz=graph.dot . dot -Tpng graph.dot -o graph.png
这些技巧不仅能解决ORB-SLAM3的问题,还能提升你处理各种C++项目构建问题的能力。记住,每个编译错误背后都有其逻辑,理解这个逻辑比单纯记住解决方案更重要。
