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

保姆级教程:在Ubuntu 20.04上用Qt 5.12.8从源码编译QGC地面站(附常见编译错误解决)

保姆级教程在Ubuntu 20.04上用Qt 5.12.8从源码编译QGC地面站附常见编译错误解决第一次尝试在Ubuntu上编译QGroundControl时我花了整整两天时间解决各种依赖和版本冲突问题。从Qt版本不匹配到子模块初始化失败再到莫名其妙的wayland组件缺失——这些坑几乎让每个新手开发者抓狂。本文将用最详细的步骤带你避开所有雷区从零开始构建可二次开发的QGC环境。1. 系统环境准备与依赖安装Ubuntu 20.04作为长期支持版本其稳定性使其成为QGC开发的理想选择。但默认安装的组件往往不能满足编译需求我们需要先打好基础环境。必须安装的基础依赖包sudo apt update sudo apt install -y build-essential cmake git ninja-build \ libssl-dev libsdl2-dev libgstreamer-plugins-base1.0-dev \ libgstreamer1.0-dev g-9 libopencv-dev libqt5opengl5-dev注意Ubuntu 20.04默认gcc版本为9.3.0而Qt 5.12.8需要至少gcc 7.5。如果系统有其他版本gcc建议通过update-alternatives切换sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-9 90 sudo update-alternatives --config gcc关键组件版本要求组件最低版本推荐版本验证命令CMake3.163.22cmake --versionGCC7.59.3gcc --versionPython3.63.8python3 --version我曾遇到因OpenSSL版本不兼容导致Qt网络模块编译失败的情况解决方案是安装特定开发包sudo apt install -y libssl1.1 libssl-dev2. Qt 5.12.8定制化安装官方提供的在线安装器往往包含不必要的组件而QGC开发只需要核心模块。推荐使用以下精简安装方案下载离线安装包wget https://download.qt.io/archive/qt/5.12/5.12.8/qt-opensource-linux-x64-5.12.8.run chmod x qt-opensource-linux-x64-5.12.8.run选择安装组件关键步骤Qt 5.12.8 → Desktop gcc 64-bitQt ChartsQt Quick Controls 2Qt WebEngineQt Script (Deprecated)警告千万不要勾选Source Components这会导致后续编译冲突。我曾因此浪费3小时排查qmake错误。配置环境变量echo export QT_DIR/opt/Qt5.12.8/5.12.8/gcc_64 ~/.bashrc echo export PATH$QT_DIR/bin:$PATH ~/.bashrc source ~/.bashrc验证安装是否成功qmake --version # 应输出QMake version 3.13. QGC源码获取与子模块处理官方仓库的Stable_V4.1分支是最稳定的二次开发起点但子模块管理是个技术活。克隆指定分支git clone --recursive https://github.com/mavlink/qgroundcontrol.git -b Stable_V4.1 cd qgroundcontrol补救子模块初始化常见问题解决方案 当网络不稳定导致子模块下载失败时执行git submodule sync --recursive git submodule update --init --recursive --depth 1我曾遇到libs/qmlglsink子模块无法下载的情况这是国内开发者常见问题。替代方案rm -rf libs/qmlglsink git clone https://gitee.com/mirrors_groestlcoin/qmlglsink.git libs/qmlglsink关键子模块清单mavlink (v2.0)QtLocation (5.12.8)QtPositioning (5.12.8)qmlglsink (特定gstreamer插件)4. 编译配置与排错指南进入最关键的编译阶段这里每一步都可能隐藏着陷阱。生成构建配置mkdir build cd build cmake .. -GNinja \ -DCMAKE_BUILD_TYPERelease \ -DQT_QMAKE_EXECUTABLE$QT_DIR/bin/qmake \ -DCMAKE_PREFIX_PATH$QT_DIR高频错误解决方案qtwayland缺失cd /tmp git clone https://github.com/qt/qtwayland.git cd qtwayland git checkout v5.12.8 $QT_DIR/bin/qmake make -j$(nproc) sudo make installGL/gl.h找不到sudo apt install -y mesa-common-dev libglu1-mesa-devundefined reference toqInitResources_* 这是qrc资源编译问题清理后重建rm -rf * cmake .. -GNinja ninja完整编译命令ninja -j$(nproc)编译成功后在build/staging目录会生成可执行文件。建议创建快捷方式ln -s $(pwd)/staging/QGroundControl ~/Desktop/QGC5. 开发环境优化与调试技巧Qt Creator配置要点在Kits中添加自定义Qt版本指向/opt/Qt5.12.8/5.12.8/gcc_64设置CMake路径为/usr/bin/cmake在Build Run中添加自定义构建步骤Command: ninja Arguments: -j8 Working directory: %{buildDir}调试线程技巧 当QGC出现卡顿时快速定位线程问题ps -T -p $(pgrep QGroundControl)内存泄漏检测 在Qt Creator的Analyzer菜单中使用Valgrind工具特别注意QML对象未释放MAVLink消息队列堆积视频解码器资源泄漏6. 二次开发快速入门项目结构关键目录├── src/ │ ├── Vehicle/ # 载具控制核心 │ ├── QmlControls/ # 自定义QML组件 │ └── Audio/ # 语音通知系统 ├── libs/ │ ├── mavlink/ # 通信协议 │ └── qmlglsink/ # 视频渲染 └── resources/ # 界面资源文件修改UI的推荐流程复制resources/qml/下的原始QML文件在src/QmlControls/创建自定义组件通过qrc资源系统覆盖默认UI通信协议扩展示例 在src/comm/MAVLinkProtocol.cc中添加自定义消息处理void MAVLinkProtocol::_handleCustomMessage(mavlink_message_t message) { if (message.msgid MAVLINK_MSG_ID_CUSTOM_COMMAND) { emit customCommandReceived(message); } }记得在mavlink/include/mavlink/v2.0/common/mavlink_msg_custom_command.h中定义消息结构体。7. 持续集成与自动化构建对于团队开发建议配置GitLab CI自动化流程.gitlab-ci.yml示例stages: - build qgc_build: stage: build image: ubuntu:20.04 script: - apt update apt install -y ... - wget https://qt.mirror.constant.com/archive/qt/5.12/5.12.8/qt-opensource-linux-x64-5.12.8.run - chmod x qt-opensource-linux-x64-5.12.8.run - ./qt-opensource-linux-x64-5.12.8.run --script qt_installer_script.qs - git clone --recursive https://github.com/mavlink/qgroundcontrol.git - cd qgroundcontrol mkdir build cd build - cmake .. -GNinja -DCMAKE_BUILD_TYPERelease - ninja artifacts: paths: - qgroundcontrol/build/staging/私有化部署技巧使用ccache加速重复编译sudo apt install ccache echo export PATH/usr/lib/ccache:$PATH ~/.bashrc搭建本地Qt镜像源rsync -avz --delete qt.mirror.constant.com::qtarchive /mnt/qt_mirror8. 性能调优实战案例启动速度优化 在src/QGCApplication.cc中禁用非必要插件QCoreApplication::setAttribute(Qt::AA_DisableShaderDiskCache); QQuickWindow::setSceneGraphBackend(QSGRendererInterface::OpenGL);内存占用分析 使用Massif可视化工具valgrind --toolmassif --massif-out-filemassif.out ./QGroundControl ms_print massif.out analysis.txtUI渲染性能提升在QML中使用Loader延迟加载复杂组件对频繁更新的数据使用Qt.binding代替直接赋值启用QML缓存import QtQuick 2.12 Item { Component.onCompleted: Qt.createQmlObject(import QtQuick 2.12; Rectangle{}, parent, cache) }9. 跨平台构建技巧Windows交叉编译准备 在Ubuntu上安装MinGW工具链sudo apt install -y g-mingw-w64-x86-64生成Windows构建配置mkdir build-win cd build-win cmake .. -DCMAKE_TOOLCHAIN_FILE../cmake/toolchain/Toolchain-mingw64.cmake \ -DQT_QMAKE_EXECUTABLE$QT_DIR/bin/qmakemacOS构建注意事项需要额外安装brew install openssl1.1 libuv解决证书问题export OPENSSL_ROOT_DIR/usr/local/opt/openssl1.110. 插件开发进阶指南创建自定义插件模板./tools/create_new_plugin.sh MyCustomPlugin插件注册机制 在src/Plugins/Plugin.cc中扩展void Plugin::registerCustomPlugin() { qmlRegisterTypeMyCustomPlugin(QGroundControl.MyPlugin, 1, 0, MyPlugin); }插件通信架构graph LR A[MainApp] --|Signal| B(Plugin) B --|Slot| C[Vehicle] C --|MAVLink| D[Hardware]调试插件加载顺序 设置环境变量查看加载流程export QGC_DEBUG_PLUGINS1 ./QGroundControl

相关文章:

保姆级教程:在Ubuntu 20.04上用Qt 5.12.8从源码编译QGC地面站(附常见编译错误解决)

保姆级教程:在Ubuntu 20.04上用Qt 5.12.8从源码编译QGC地面站(附常见编译错误解决) 第一次尝试在Ubuntu上编译QGroundControl时,我花了整整两天时间解决各种依赖和版本冲突问题。从Qt版本不匹配到子模块初始化失败,再到…...

SCP:单细胞数据分析管道的多维技术解析与实战指南

SCP:单细胞数据分析管道的多维技术解析与实战指南 【免费下载链接】SCP An end-to-end Single-Cell Pipeline designed to facilitate comprehensive analysis and exploration of single-cell data. 项目地址: https://gitcode.com/gh_mirrors/sc/SCP 在单细…...

从脑电波到股票预测:变分模态分解(VMD)在Python里的3个实战应用

从脑电波到股票预测:变分模态分解(VMD)在Python里的3个实战应用 变分模态分解(VMD)作为一种自适应信号处理方法,近年来在多个领域展现出强大的交叉应用潜力。不同于传统傅里叶变换或小波分析,VM…...

告别模糊图像:用Python+OpenCV手把手实现维纳滤波图像去噪(附完整代码)

告别模糊图像:用PythonOpenCV手把手实现维纳滤波图像去噪 你是否遇到过这样的困扰?珍贵的照片因为拍摄时的抖动变得模糊不清,或是扫描的文档上布满了恼人的噪点。这些问题不仅影响观感,还可能丢失重要信息。今天,我们将…...

终极iOS设备支持解决方案:如何快速解决Xcode版本兼容性问题

终极iOS设备支持解决方案:如何快速解决Xcode版本兼容性问题 【免费下载链接】iOSDeviceSupport All versions of iOS Device Support 项目地址: https://gitcode.com/gh_mirrors/ios/iOSDeviceSupport iOSDeviceSupport是一个专门解决Xcode设备调试兼容性问题…...

iOS设备调试支持文件自动化管理解决方案:企业级开发效率提升架构

iOS设备调试支持文件自动化管理解决方案:企业级开发效率提升架构 【免费下载链接】iOSDeviceSupport All versions of iOS Device Support 项目地址: https://gitcode.com/gh_mirrors/ios/iOSDeviceSupport iOSDeviceSupport项目为解决iOS开发中Xcode与设备系…...

3步掌握B站视频转文字:高效构建智能内容提取工作流

3步掌握B站视频转文字:高效构建智能内容提取工作流 【免费下载链接】bili2text Bilibili视频转文字,一步到位,输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 在信息爆炸的时代,视频内容已成为知…...

5分钟快速上手:通达信缠论可视化分析插件完整指南

5分钟快速上手:通达信缠论可视化分析插件完整指南 【免费下载链接】Indicator 通达信缠论可视化分析插件 项目地址: https://gitcode.com/gh_mirrors/ind/Indicator 想要在通达信软件中实现专业的缠论技术分析吗?这款开源缠论可视化分析插件正是您…...

从OFD到PDF:3步实现文档格式的无缝转换

从OFD到PDF:3步实现文档格式的无缝转换 【免费下载链接】Ofd2Pdf Convert OFD files to PDF files. 项目地址: https://gitcode.com/gh_mirrors/ofd/Ofd2Pdf 在数字化办公的今天,您是否经常遇到OFD文档无法在通用设备上打开的困扰?Ofd…...

用Python和YOLOv5s.pt模型,5分钟搞定FPS游戏目标检测的屏幕截图与坐标计算

5分钟实战:用PythonYOLOv5构建高精度FPS游戏目标检测系统 在FPS游戏开发与辅助工具领域,实时目标检测一直是技术攻坚的重点。传统方案往往面临帧率低下、坐标偏移等问题,而现代计算机视觉技术为这一场景提供了全新解法。本文将手把手带您实现…...

Python 异步任务队列调度实现

Python异步任务队列调度实现:高效处理并发任务的利器 在现代Web应用和分布式系统中,异步任务队列调度是提升性能的关键技术之一。Python凭借其丰富的异步生态,为开发者提供了灵活的任务队列解决方案。无论是处理耗时任务、定时调度&#xff…...

2026年厦门寻味指南:这6家地道特产店,本地人私藏

在厦门,买特产是一门学问。游客扎堆的景区商业街,价格虚高、品质参差是常态。真正的老厦门人,自有他们信赖的“秘密基地”。这些店铺往往藏身于老城区、市场周边,靠的是口口相传的口碑和几十年如一日的诚信经营。今天,…...

别再乱用MATLAB变量了!用Simulink结构体管理模块参数,效率提升不止一点点

Simulink参数管理的革命:用结构体告别变量地狱 当你打开一个大型Simulink模型时,工作区里密密麻麻的变量列表是否让你感到窒息?Zw、Mw、Mq、Gain_A、Offset_B...这些看似有规律的命名在模型规模扩大后很快会演变成一场命名灾难。我曾接手过一…...

PS2手柄协议逆向与STM32移植笔记:如何让老手柄在新项目里焕发第二春

PS2手柄协议逆向与STM32移植笔记:如何让老手柄在新项目里焕发第二春 周末整理储物柜时,翻出一个尘封多年的PS2无线手柄。这款2004年随PlayStation2发售的经典外设,曾陪伴无数玩家度过热血沸腾的游戏时光。如今主机早已退役,但手柄…...

超越简单余弦距离:用‘局部残差’思想为你的图像特征匹配加个Buff

超越简单余弦距离:用‘局部残差’思想为你的图像特征匹配加个Buff 当你在电商平台搜索"白色连衣裙"时,系统如何在数百万商品图中精准找到最符合预期的款式?当你在手机相册输入"海滩日落"时,算法又是怎样从数万…...

1.2 配置开发环境(VS Code / PyCharm)

配置 VS Code 开发环境 安装 VS Code 从 VS Code 官网 下载对应操作系统的安装包,完成安装后启动。 安装 Python 扩展 在扩展市场中搜索 Python,安装官方提供的扩展以支持语法高亮、调试等功能。 配置 Python 解释器 按下 CtrlShiftP 打开命令面板&am…...

NumPy进阶:除了求范数,np.linalg.norm()的axis和keepdims参数在数据清洗与特征工程中的妙用

NumPy工程化实践:用np.linalg.norm()的axis与keepdims重构数据预处理流程 当你面对一个500万行的用户行为特征矩阵时,是否会习惯性写出for循环来计算每行数据的L2范数?我曾用三小时调试一个维度不匹配的报错,最终发现只是忘记设置…...

告别漂移轨迹!用Valhalla的HMM地图匹配API,5分钟搞定车辆轨迹纠偏

5分钟实战:用Valhalla的HMM算法实现高精度车辆轨迹纠偏 当物流调度系统显示某辆货车正在珠江中央"行驶",或是共享单车轨迹在建筑物间"穿墙而过",这些令人啼笑皆非的GPS漂移现象背后,是每个轨迹数据处理工程师…...

质谱数据分析新纪元:MZmine 3如何让复杂数据变得简单易懂?

质谱数据分析新纪元:MZmine 3如何让复杂数据变得简单易懂? 【免费下载链接】mzmine3 mzmine source code repository 项目地址: https://gitcode.com/gh_mirrors/mz/mzmine3 你是否曾面对海量的质谱数据感到无从下手?当色谱图上密密麻…...

手把手教你用Xilinx IP核搭建AXI Master接口(附Verilog代码逐行解析)

从零构建AXI Master接口:Xilinx IP核深度解析与实战指南 在当今FPGA系统设计中,AXI总线已成为连接IP核的黄金标准。但对于许多工程师来说,从官方文档到实际工程实现之间总存在一道难以逾越的鸿沟。本文将带您深入Xilinx AXI IP核的内部实现&a…...

3个视角重构:Galgame社区如何从信息孤岛走向生态聚合

3个视角重构:Galgame社区如何从信息孤岛走向生态聚合 【免费下载链接】kun-touchgal-next TouchGAL是立足于分享快乐的一站式Galgame文化社区, 为Gal爱好者提供一片净土! 项目地址: https://gitcode.com/gh_mirrors/ku/kun-touchgal-next 当一位Galgame爱好者…...

保姆级教程:用Python搞定TOF深度相机数据转点云(附源码与避坑指南)

从深度图到三维世界:Python实战TOF相机点云转换全攻略 深度相机正逐渐成为机器视觉领域的标配工具,而TOF(Time of Flight)技术因其独特的优势备受关注。不同于传统RGB相机只能捕捉平面信息,TOF相机通过测量光线飞行时间…...

别再为微信登录报错40029发愁了!Uniapp打包正式签名APK的避坑实操指南

Uniapp微信登录40029错误终极解决方案:从签名到上线的完整避坑手册 微信登录作为移动应用最常用的第三方登录方式之一,却常常成为Uniapp开发者的"拦路虎"。当你兴致勃勃地点击"微信登录"按钮,却收到冰冷的"40029&q…...

英维思/康吉森TRICONEX 3721 (AI32TMR)模块

在工业自动化的精密世界里,每一个数据的精准传递都关乎生产的命脉。英维思TRICONEX 3721 AI32TMR模块,就像一位沉默的守护者,以三重冗余的硬核架构,为石油化工、电力能源等高危行业筑牢安全防线。李工180**6050**3853它诞生于对工…...

Notepad--跨平台文本编辑器实战:国产替代的高效解决方案

Notepad--跨平台文本编辑器实战:国产替代的高效解决方案 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器,目标是做中国人自己的编辑器,来自中国。 项目地址: https://gitcode.com/GitHub_Trending/no/notepad-- No…...

Overleaf实战:手把手教你用LaTeX画出教科书级别的分块矩阵与范数

Overleaf实战:教科书级分块矩阵与范数绘制指南 如果你曾在学术论文或技术文档中遇到过需要展示复杂矩阵结构的情况,一定体会过排版带来的挫败感。传统文字处理软件对数学公式的支持总是差强人意,而LaTeX作为科研排版的事实标准,却…...

掌握Notepad--:国产跨平台文本编辑器的终极实用指南

掌握Notepad--:国产跨平台文本编辑器的终极实用指南 【免费下载链接】notepad-- 一个支持windows/linux/mac的文本编辑器,目标是做中国人自己的编辑器,来自中国。 项目地址: https://gitcode.com/GitHub_Trending/no/notepad-- Notepa…...

从图像和视频处理实战出发:手把手教你用torch.cat拼接特征图(附代码)

特征图拼接实战:用torch.cat提升计算机视觉模型性能 在计算机视觉任务中,特征图的拼接操作远比想象中重要。想象一下,当你需要将不同层级的特征融合起来提升模型性能时,或者在进行图像分割任务中需要将编码器和解码器的特征连接起…...

【网络排查工具】SRE手边这 6 个命令,能搞定 90% 的网络故障

你在排查网络故障时,是不是上来就 ping 一下,通了就觉得“没事”?然后用户说“还是慢”,你又 traceroute 看一遍,发现一堆 * * * 就懵了?老实说,我干 SRE 的头两年也这样。后来被线上事故教育了…...

机械识图:剖视图

视图主要用于表达机件的外部形状和结构,当机件的内部形状和结构(简称为内形)比较复杂时,若采用视图表示,在某些视图中就会出现较多的虚线,既不便于读图和标注尺寸,图面也不清晰。剖视图的形成 假…...