Ubuntu18.04源码编译QGroundControl 4.2遇Qt相关编译错误求助
源码编译QGroundControl 4.2 触发Qt类型未定义/不完整类型报错
环境信息
- 操作系统:Ubuntu 18.04
- Qt版本:5.15.2(源码编译的最小化版本)
- QGroundControl版本:4.2
问题描述
已完成QGC要求的Qt 5.15.2版本源码编译,在qgroundcontrol/build目录下执行构建:
- 执行
qmake ..配置阶段无异常,输出信息包含:识别Qt版本为5.15.2、Linux平台构建、每日构建通道、GIT版本标签为v4.2.3、Release发布版本、跳过Pairing配对支持、使用ardupilotmegaMAVLink方言、因平台不支持跳过Zeroconf零配置网络、启用AirMap支持、禁用Taisync/Microhard模块、启用视频流支持;同时提示项目使用Qt私有头文件,仅与当前构建的Qt模块版本绑定,跨版本运行可能出现随机崩溃,属于使用Qt内部接口的预期现象。 - 执行
make编译阶段首次报错:QGCTileCacheWorker.cpp第1188行报error: expected type-specifier before ‘QTcpSocket’,后续连带出现QTcpSocket未声明、lambda表达式未捕获socket变量等连锁错误,最终导致QGCTileCacheWorker.o目标文件编译失败。
排查确认错误原因是QGCTileCacheWorker.cpp缺少必要头文件引用,疑问点为:使用QGC官方指定的对应Qt版本,为何源码中会缺失该头文件的引入声明?
修复上述头文件问题后,编译触发新的错误:
MapProvider.cpp第23行报error: incomplete type ‘QLocale’ used in nested name specifier,导致MapProvider.o目标文件编译失败;GoogleMapProvider.cpp编译时先后报QSslConfiguration类型不完整、QNetworkRequest无sslConfiguration/setSslConfiguration成员、QSslSocket未声明等错误,导致GoogleMapProvider.o目标文件编译失败。
解决方案
核心原因
所有报错的根因是你使用的是自编译最小化版本Qt 5.15.2,和QGC官方CI构建使用的预编译Qt版本存在组件、特性裁剪差异,不是QGC源码本身的问题:
- 官方预编译Qt版本会在公共头文件中间接引入常用类的头文件,很多源码不需要显式include也能正常编译;最小化裁剪编译的Qt会砍掉这类间接头文件引入链路,同时如果缺少系统依赖、编译时关闭了对应特性,相关类会没有完整定义、甚至不生成对应成员函数。
具体修复步骤
- 先安装Qt编译依赖的系统库
执行命令安装缺失的系统依赖:sudo apt update sudo apt install libssl-dev libicu-dev libgl1-mesa-dev libpulse-dev - 重新编译Qt 5.15.2,补齐QGC依赖的模块和特性
执行Qt configure时不要用纯最小化参数,必须开启以下必要组件:
配置完成后重新执行./configure \ -release \ -opensource \ -confirm-license \ -openssl-linked \ -icu \ -qt-network \ -qt-qml \ -qt-quick \ -qt-location \ -qt-multimedia \ -qt-svgmake -j$(nproc)、sudo make install完成Qt安装,确保QtNetwork模块启用SSL支持、QtCore模块启用完整QLocale(依赖icu)支持。 - 临时头文件补全(仅做验证用,最终建议用正确配置的Qt编译)
如果暂时不想重编Qt,可以在对应报错的源文件顶部补全缺失的头文件引用:QGCTileCacheWorker.cpp添加#include <QTcpSocket>MapProvider.cpp添加#include <QLocale>GoogleMapProvider.cpp添加#include <QSslConfiguration>、#include <QSslSocket>
注意:如果补全头文件后仍然报类型不完整、类成员不存在的错误,说明对应Qt模块没有把相关特性编译进去,必须按步骤2重编Qt,光补头文件无法解决问题。
内容的提问来源于stack exchange,提问作者Ashish Magar
相关产品推荐
相关产品推荐

