You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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目录下执行构建:

  1. 执行qmake ..配置阶段无异常,输出信息包含:识别Qt版本为5.15.2、Linux平台构建、每日构建通道、GIT版本标签为v4.2.3、Release发布版本、跳过Pairing配对支持、使用ardupilotmega MAVLink方言、因平台不支持跳过Zeroconf零配置网络、启用AirMap支持、禁用Taisync/Microhard模块、启用视频流支持;同时提示项目使用Qt私有头文件,仅与当前构建的Qt模块版本绑定,跨版本运行可能出现随机崩溃,属于使用Qt内部接口的预期现象。
  2. 执行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会砍掉这类间接头文件引入链路,同时如果缺少系统依赖、编译时关闭了对应特性,相关类会没有完整定义、甚至不生成对应成员函数。

具体修复步骤

  1. 先安装Qt编译依赖的系统库
    执行命令安装缺失的系统依赖:
    sudo apt update
    sudo apt install libssl-dev libicu-dev libgl1-mesa-dev libpulse-dev
    
  2. 重新编译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-svg
    
    配置完成后重新执行make -j$(nproc)、sudo make install完成Qt安装,确保QtNetwork模块启用SSL支持、QtCore模块启用完整QLocale(依赖icu)支持。
  3. 临时头文件补全(仅做验证用,最终建议用正确配置的Qt编译)
    如果暂时不想重编Qt,可以在对应报错的源文件顶部补全缺失的头文件引用:
    • QGCTileCacheWorker.cpp添加#include <QTcpSocket>
    • MapProvider.cpp添加#include <QLocale>
    • GoogleMapProvider.cpp添加#include <QSslConfiguration>、#include <QSslSocket>

    注意:如果补全头文件后仍然报类型不完整、类成员不存在的错误,说明对应Qt模块没有把相关特性编译进去,必须按步骤2重编Qt,光补头文件无法解决问题。


内容的提问来源于stack exchange,提问作者Ashish Magar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 01:27:28