当前位置: 首页 > news >正文

别再被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.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++项目构建问题的能力。记住,每个编译错误背后都有其逻辑,理解这个逻辑比单纯记住解决方案更重要。

http://www.gsyq.cn/news/1497363.html

相关文章:

  • 三沙百达翡丽+宝珀手表专业回收,26年精选回收店铺排行榜推荐 - 莘州文化
  • 别再只跑Speedtest了!用Iperf3给你的OpenWrt软路由做个深度性能体检(附完整命令)
  • 别再死记硬背排序规则了!深入理解C++中结构体多关键字排序的两种核心思想
  • 别再死记硬背了!用C语言打印数字金字塔,这3种核心思路帮你彻底搞懂循环嵌套
  • 厦门萧邦+劳力士手表专业回收,26年精选回收店铺排行榜推荐 - 莘州文化
  • 从工地安全帽到H5视频通话:一个uni-app + WebRTC项目的完整踩坑实录
  • 从VGG到ResNet:如何给你的CNN模型轻松加上SCA-CNN注意力模块(附PyTorch代码)
  • 多维聚合与滚动计算:金融场景下的业务可解释性实践
  • 山南帝舵+浪琴手表专业回收,26年精选回收店铺排行榜推荐 - 莘州文化
  • 汕头欧米茄+宇航手表专业回收,26年精选回收店铺排行榜推荐 - 莘州文化
  • 十堰萧邦+劳力士手表专业回收,26年精选回收店铺排行榜推荐 - 莘州文化
  • 六安法穆兰+宝玑手表专业回收,26年精选回收店铺排行榜推荐 - 莘州文化
  • 别再只用os.listdir了!Python文件遍历,用glob模块这5个技巧更高效
  • 华为工程师私藏技巧:用Curl命令+Excel表格搞定ICS Lite海量文件下载
  • 揭秘99.6%稠密度的KuaiRec数据集:它如何革新推荐系统的离线评估?
  • 石家庄法穆兰+宝玑手表专业回收,26年精选回收店铺排行榜推荐 - 莘州文化
  • 龙岩美度雅典+天梭手表专业回收,26年精选回收店铺排行榜推荐 - 莘州文化
  • 从《星夜》到你的照片:聊聊风格迁移算法里那些影响效果的‘魔法参数’
  • 汕尾欧米茄+宇航手表专业回收,26年精选回收店铺排行榜推荐 - 莘州文化
  • 旧服务器变废为宝:用Dell服务器+RouterOS 6.x搭建家庭多线负载均衡网关(保姆级避坑指南)
  • KylinOS V10 SP2上MySQL 8.0.28二进制包安装保姆级教程(附glibc版本选择避坑指南)
  • 石嘴山法穆兰+宝玑手表专业回收,26年精选回收店铺排行榜推荐 - 莘州文化
  • 商洛伯爵+沛纳海手表专业回收,26年精选回收店铺排行榜推荐 - 莘州文化
  • 从LM741内部电路入手,手把手教你理解差动放大电路的工作原理
  • 创建型模式:对象的诞生艺术
  • Google Sheets实时抓取网页数据的三层方案选型指南
  • 赣州伯爵+沛纳海手表专业回收,26年精选回收店铺排行榜推荐 - 莘州文化
  • 固原伯爵+沛纳海手表专业回收,26年精选回收店铺排行榜推荐 - 莘州文化
  • 2026 演讲口才培训师证书报考详解:报考流程、报考方式、课程大纲、职业发展指引与官方授权招生机构 - 教育推荐官【官方】
  • Vue3 + OpenLayers 7 实战:手把手教你实现一个带撤销功能的WebGIS测距工具