别再被CMake报错劝退!Ubuntu 20.04上ORB-SLAM3编译失败的三个关键修复点
2026/6/10 12:16:25 网站建设 项目流程

攻克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.cppTracking.cc等文件中抛出各种语法错误。

修复方案有以下两种,任选其一即可:

  1. ORB_SLAM3/CMakeLists.txt文件中添加:

    set(CMAKE_CXX_STANDARD 14)
  2. 或者在同一个文件中添加编译选项:

    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。

分步解决方案

  1. 创建pkgconfig目录(如果不存在):

    sudo mkdir -p /usr/local/lib/pkgconfig
  2. 创建并编辑opencv.pc文件:

    sudo nano /usr/local/lib/pkgconfig/opencv.pc
  3. 填入以下内容(根据你的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
  4. 更新pkg-config路径:

    export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH

这个问题的棘手之处在于,错误信息并没有明确指出是.pc文件缺失。通过理解pkg-config机制,你不仅能解决ORB-SLAM3的问题,还能应对其他依赖OpenCV的项目构建问题。

3. Eigen版本兼容性:内存不足设备的隐形杀手

在树莓派或Jetson等内存有限的设备上编译时,你可能会遇到编译过程卡死的情况。这通常是因为Eigen版本过高导致内存消耗过大,而不仅仅是警告信息那么简单。

优化方案对比

方案操作优点缺点
降级Eigensudo 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. 构建流程最佳实践:从源码到可执行文件

掌握了上述三个关键点后,让我们梳理一个完整的构建流程:

  1. 环境准备

    • 安装基础依赖:
      sudo apt-get install build-essential cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
  2. 源码获取与准备

    git clone https://github.com/UZ-SLAMLab/ORB_SLAM3.git ORB_SLAM3 cd ORB_SLAM3 chmod +x build.sh
  3. 应用修复方案

    • 编辑CMakeLists.txt添加C++14支持
    • 确保OpenCV的pkg-config配置正确
    • 检查Eigen版本
  4. 构建与安装

    ./build.sh

常见问题速查表

错误现象可能原因快速检查方法
各种语法错误C++标准不匹配检查CMakeLists中的CXX_STANDARD设置
找不到OpenCVpkg-config问题运行pkg-config --modversion opencv
编译卡死内存不足/Eigen问题查看free -h和Eigen版本

5. 超越基础:高级调试技巧

当上述方案仍然不能解决问题时,你需要更深入的调试手段:

  1. 详细日志分析

    make VERBOSE=1

    这会显示完整的编译命令,帮助你定位确切的问题点。

  2. 单文件编译测试: 选择其中一个报错的源文件单独编译:

    g++ -std=c++14 -I/path/to/includes -c src/MLPnPsolver.cpp
  3. 依赖关系可视化(需要graphviz):

    cmake --graphviz=graph.dot . dot -Tpng graph.dot -o graph.png

这些技巧不仅能解决ORB-SLAM3的问题,还能提升你处理各种C++项目构建问题的能力。记住,每个编译错误背后都有其逻辑,理解这个逻辑比单纯记住解决方案更重要。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询