ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

UOS系统Qt开发环境搭建指南:从依赖配置到工具链实战

UOS系统Qt开发环境搭建指南:从依赖配置到工具链实战

1. 写在前面:为什么要在UOS上配一套Qt环境

这几年国产操作系统越来越普及,很多开发者的日常工作环境已经从Windows、Ubuntu逐步迁移到了UOS桌面系统上。UOS基于Debian体系,底子成熟,但毕竟是面向桌面的发行版,开发者在上面做C++桌面应用开发时,第一道坎往往不是写代码本身,而是把一个完整的Qt开发环境从零配好。

这篇文章就围绕“UOS上搭建Qt开发环境”这件事,把我在实际部署过程中踩过的坑、验证过的方案、以及最终沉淀下来的一套稳定流程完整拆开讲。内容适合三类人看:刚把工作机换成UOS、准备做Qt开发的C++工程师;需要在UOS上维护历史Qt项目的运维或开发人员;以及想给团队出一份环境搭建文档、但自己还没完全摸清头绪的技术负责人。

先给结论:在UOS上搭建Qt开发环境,本质上就是把三件事做对——选对安装方式、配齐系统依赖、正确设置工具链关联。三件事任何一环出问题,后面编译跑demo都会连环报错。下面逐步展开。

2. 整体思路:三条安装路线怎么选

在动手之前,先要把安装策略想清楚。UOS上装Qt不是只有一种办法,不同办法对应不同场景,选错了后面会很被动。

2.1 系统仓库直装:省事但有版本天花板

UOS的软件源里直接带了Qt和Qt Creator相关包,用apt就能装。这是最省事的方式,命令敲完基本就能用,依赖关系系统自动处理。但问题同样明显:仓库里的Qt版本通常偏旧,而且不会同时提供多个版本供切换。如果你只是写一些简单工具、内部管理系统,仓库版够用;如果项目对Qt版本有明确要求,比如必须用某个新特性或者要和现有CI产物保持一致,仓库版就绑不住脚了。

我个人的判断标准是:先问项目要什么版本,再决定怎么装。而不是先随便装一个,等编译报错了再回头换。这个顺序反了,时间成本至少多花半天。

2.2 官方在线安装器:版本自由但依赖要自己喂

Qt官方针对Linux提供了在线安装器,安装时可以选择Qt版本、套件组件,非常灵活。它默认安装到用户目录,不需要root权限,也不会污染系统。这是目前最主流的方案,我最终跑通的稳定环境就是这条路线。

但它有个让新手抓狂的点:官方安装器只管把Qt本体和Qt Creator装好,不会帮你处理系统级依赖。比如编译时需要xcb平台插件相关的系统库、显卡驱动相关的库,这些都要自己用apt补齐。缺一个,Qt Creator能打开,但程序一运行就报could not load the Qt platform plugin "xcb",整个界面弹不出来。

注意:如果你打算用官方安装器,先做好心理准备——后面至少还有十几二十个依赖包等着你手动喂。喂的过程别心烦,这就是Linux下装软件的常态。

2.3 源码编译:最可控但性价比最低

源码编译安装Qt,也就是从官方下载源码包,自己执行configure、make、make install。它的好处是可控性拉满:编译参数自己定,安装路径自己定,交叉编译也方便。但坏处也极其明显:整套Qt编译一次耗时很长,而且UOS上的依赖问题一个都不会少,还得额外处理Perl、Python等构建工具的版本兼容。

我个人的建议是:除非你是要定制Qt模块、做嵌入式交叉编译,或者其他两条路线都走不通,否则不要一上来就源码编译。把时间花在值得的地方,Qt本身编译一遍的时间,够你把三套环境搭完再跑十个demo了。

3. 动手前的环境确认与依赖准备

路线定下来之后,不要急着下载安装器,先把系统底子检查一遍。这一步看起来不起眼,但实际上决定了后续流程能不能顺畅走下去。

3.1 确认系统版本和架构

不同机器架构对应的安装包是不同的。UOS目前最常遇到的是x86_64架构,但也有不少机器是ARM架构(尤其是信创设备)。

打开终端执行:

uname -m

输出x86_64就代表是Intel/AMD 64位架构,输出aarch64就代表ARM 64位架构。这个信息后面下载Qt安装器时要对应选好,选错了安装器压根跑不起来。

再确认一下系统版本:

cat /etc/os-release

UOS的版本号会影响软件源策略。不同版本对应的源可能不同,如果源配置不对,apt安装依赖时就会遇到404或者找不到包的情况。所以这一步别跳过,至少心里有数。

3.2 软件源检查与更新

UOS的软件源配置文件在/etc/apt/sources.list,部分版本还把源拆到了/etc/apt/sources.list.d/目录下。先确认源可用,再执行更新:

sudo apt update

执行过程中留意有没有报错。如果出现大量404,说明源配置有问题,或者是系统刚升级过但源没同步,需要先修源再继续。我见过不少人在这一步就直接翻车,后面装什么都说找不到包,根源就是源挂了还在硬装。

3.3 安装编译工具链

Qt编译依赖完整的C++工具链。下面的包是基础中的基础:

sudo apt install build-essential

build-essential会带上gcc、g++、make等一系列基础编译工具。装完之后验证一下版本:

gcc --version g++ --version make --version

编译工具链正常,才有继续往下走的基础。

另外建议顺手把CMake装上。虽然Qt自带qmake,但很多现代项目已经转向CMake构建,UOS的Qt Creator对CMake的支持也更好:

sudo apt install cmake

如果后面准备做OpenGL相关的开发,mesa和GL库也要提前装好,否则Qt的OpenGL模块编译运行都会报错。这个到后文实操环节会单独说。

3.4 硬件显卡驱动的坑提前排掉

UOS默认用的是系统自带的开源显卡驱动,大部分情况下配合Qt没问题。但如果你用的是比较新的独立显卡,或者跑在虚拟机里,OpenGL支持可能会出现异常。典型表现是:程序能启动,但窗口渲染不出来,或者Qt Creator的“欢迎”界面显示黑屏。

建议提前检查OpenGL支持情况:

glxinfo | grep "OpenGL renderer"

如果没有glxinfo命令,先装一下mesa-utils。如果输出的是软件渲染(llvmpipe之类),说明没有硬件加速。这种情况下Qt程序未必不能跑,但性能会打折扣,而且某些依赖OpenGL的功能会异常。虚拟机环境下这是正常现象,不用太纠结;实体机如果也是软渲染,就要考虑驱动问题了。

4. 实操全程:从下载安装器到环境变量配置

前面的准备工作做完,现在进入核心环节。这里以官方在线安装器路线为例,因为这是适用范围最广、也最容易复现完整功能的方案。

4.1 下载并启动官方安装器

去Qt官网下载Linux版在线安装器时,有几个细节注意一下。

  • 选择与架构匹配的安装包,x86_64和ARM要区分开;
  • 下载完成后先加执行权限再运行:
chmod +x qt-unified-linux-*.run ./qt-unified-linux-*.run

如果是在纯命令行环境下安装,可以加--headless参数走静默模式,但一般桌面环境直接图形化安装即可。

启动后安装器会要求登录Qt账号。这里有一个很现实的坑:在线安装器必须登录账号才能继续,但有些网络环境下Qt官网登录页面加载不出来。解决思路:要么换个网络,要么配置代理,要么干脆走离线包路线。如果你所在环境访问Qt官网不稳定,建议直接换离线安装包方案,不要跟网络较劲。

4.2 选择组件:哪些必选,哪些可以缓一缓

进入组件选择界面后,会有很多选项。默认情况下安装器会勾选最新版Qt和对应的Qt Creator,但实际上全量勾选没有意义,还会把磁盘和时间都消耗掉。我通常只勾这几类:

  • 当前项目要求的Qt LTS版本(比如5.15系列或6.x系列);
  • Qt Creator(IDE本体);
  • 对应版本的编译套件组件(Qt Modules里包含的qtbase、qtdeclarative等根据实际需求勾)。

不要贪多。Qt的模块非常庞大,全装下来十几个GB不是开玩笑的。先装核心模块,等实际项目需要某个模块时,再补装也来得及。

4.3 安装完成后的关键一步:手动导出环境变量

安装完成后,Qt默认会被放在类似~/Qt/的目录下,里面按版本号和编译器架构分了子目录。这时候很多人直接打开Qt Creator就开始建项目,结果编译一跑就发现找不到gcc、找不到make、甚至是找不到Qt自身库。原因很简单:环境变量没有配置好。

需要把Qt的bin目录加入PATH:

export PATH=$HOME/Qt/<版本号>/gcc_64/bin:$PATH

考虑到每次开终端都要生效,建议把这行写进~/.bashrc:

echo 'export PATH=$HOME/Qt/<版本号>/gcc_64/bin:$PATH' >> ~/.bashrc source ~/.bashrc

还有一个常被忽略的环境变量是QT_QPA_PLATFORM。如果程序启动时报xcb相关错误,可以先临时设为offscreen验证逻辑是否正常:

export QT_QPA_PLATFORM=offscreen ./你的程序

能跑说明程序本身没有大问题,问题出在平台插件或显示环境上。这个变量只建议用来临时排查,不要写进正式配置文件。

4.4 补系统依赖:常见的那些包一次讲清

Qt官方安装器装完后,第一次跑Qt Creator或者编译出来的程序时,大概率会在终端里看到类似这样的报错:

qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.

这个报错太经典了。它基本等于在告诉你:libqxcb.so需要的部分系统库没有装全。在UOS下,我实测补齐下面这些包以后问题消失:

sudo apt install libxcb-xinerama0 sudo apt install libxcb-cursor0 sudo apt install libxkbcommon-x11-0 sudo apt install libgl1-mesa-dev sudo apt install libglib2.0-dev sudo apt install libfontconfig1-dev sudo apt install libfreetype6-dev

有些包在较新版本的UOS里可能已经预装,重复安装也不会有副作用。装完后再启动程序,80%以上的xcb报错都能解决。

如果装完还报xcb错,多半是libxcb-*系列库版本不匹配。可以用ldd命令查看具体缺哪个库,再对症安装,不要盲目重装Qt。

4.5 离线安装包路线的区别

如果你选择了离线安装包路线,前面的流程整体不变,但有两个差异点:

  • 离线包体积巨大,通常接近2~3GB,下载时间更长;
  • 登录账号不再是必选项,这一点在某些网络受限的环境下反而是优势。

离线包安装完成后,环境变量、依赖库的配置思路和在线安装完全一致,后面的步骤可以照抄。

5. Qt Creator配置:让IDE和工具链握手成功

Qt Creator装好之后,还需要确保它正确识别了编译器、调试器、CMake和Qt版本。这四者配置正确,开发环境才算真正闭环。

5.1 编译器自动检测与手动添加

Qt Creator打开“工具”里的“Kits”设置界面,正常情况下会自动检测系统里的gcc、g++、gdb、cmake。如果没有自动检测到,点击添加,手动指向以下路径:

  • C编译器:/usr/bin/gcc
  • C++编译器:/usr/bin/g++
  • 调试器:/usr/bin/gdb(没有就先装:sudo apt install gdb)
  • CMake:/usr/bin/cmake

手动添加时注意工具链名称和路径不要配错。这里有个细节:Qt Creator的Kit页面里,每一个编译套件都必须同时绑定“编译器”和“Qt版本”。如果哪一侧是黄色感叹号或红色错误,这个Kit就是不可用的,建项目时会直接灰掉“Build”按钮。

5.2 Qt版本注册

确认Qt版本是否被正确识别,打开“Qt Versions”页面,正常情况下会列出你安装的所有Qt。如果列表为空,手动添加qmake路径,在Qt安装目录里找到gcc_64/bin/qmake,选中即可。

这一步的关键在于区分qmake版本。如果系统里既有仓库装的Qt旧版,又装了官方安装器的新版,两个qmake都出现在列表里,容易搞混淆。建议在Qt Versions界面给每个版本重命名加上版本号,Kit里选择时不容易选错。

5.3 Kit选择与默认设置

Kits设置里每个Kit都有一个名称,默认可能叫“Desktop Qt x.x.x”。建议把名称改成带版本号的格式,比如“Qt 5.15.2 Desktop”。别小看这个命名习惯,项目多了以后,这个命名能救命。

默认Kit改好后,建项目时直接选它,就基本不会出现编译链找不到的问题了。

6. 用一个小Demo验证整个环境

环境配好还只是完成了70%,剩下的30%是验证。很多问题不在安装阶段暴露,而在第一个项目编译运行时才冒出来。所以建一个最简单的Qt Widgets程序跑一圈,是必经流程。

6.1 创建项目并确认构建系统

打开Qt Creator,新建一个“Qt Widgets Application”项目。系统会让你选择构建系统,建议选CMake,理由前面说过,现代项目主流趋势就是CMake,而且Qt Creator对CMake的支持明显好于qmake。

如果你坚持用qmake,也没问题,现有项目如果是qmake体系就继续用qmake,没必要强行迁移。新建项目就选CMake。

6.2 实际编译中可能遇到的报错

项目建好后,先「构建」再「运行」。在这个环节,我遇到过几次有代表性的问题,记录如下:

问题一:找不到GL/gl.h

报错类似fatal error: GL/gl.h: No such file or directory。这是OpenGL开发头文件缺失,按前面的依赖清单执行一下即可:

sudo apt install libgl1-mesa-dev

问题二:找不到Qt5XcbQpa库

报错类似cannot find -lQt5XcbQpa。这通常是Qt的platform插件相关库没连接好,先重新检查依赖包是否齐全,再确认Qt安装目录里的plugins/platforms/目录下有没有libqxcb.so。没有的话,回到Qt安装器补装组件。

问题三:程序能编译但运行时窗口不弹出来

这种情况我建议先确认是不是窗口显示在别的桌面环境里了,再看是不是显卡驱动问题。可以直接在终端里运行程序,观察输出日志。如果日志停在“This application failed to start because no Qt platform plugin could be initialized”,就必须回到xcb依赖那一环排查。

6.3 一个简单的编译验证命令

如果你不想开图形界面,也可以在终端里纯手动编译验证:

cd ~/test_proj qmake -o Makefile test_proj.pro make ./test_proj

这个方式能验证环境变量是否配好、qmake是否生效、链接是否正常。逻辑上比IDE编译更底层,排错也更直接。

7. 常见问题速查表

把高频问题集中整理成了一张表,方便你遇到问题直接“抄作业”。

问题现象根因方向排查/解决动作
could not load the Qt platform plugin "xcb"系统xcb相关依赖缺失安装libxcb-xinerama0、libxcb-cursor0、libxkbcommon-x11-0等包
GL/gl.h: No such file or directoryOpenGL开发库缺失sudo apt install libgl1-mesa-dev
cannot find Qt5XcbQpaQt平台插件库缺失检查Qt安装目录plugins/platforms/,必要时重装组件
Qt Creator Kit显示红色感叹号编译器/调试器/Qt版本未绑定检查Kit设置里的编译器路径和Qt版本路径
程序编译通过但运行无界面可能是软件渲染或被其他环境拦截用QT_QPA_PLATFORM=offscreen临时验证逻辑是否正常
g++: command not found工具链未安装sudo apt install build-essential
运行程序提示缺少某Qt模块装Qt时组件不全重开安装器,补充勾选对应模块组件
CMake项目构建时找不到Qt未配置CMAKE_PREFIX_PATH在CMake配置里添加Qt路径/gcc_64/lib/cmake目录
Qt Creator中文界面显示乱码字体或语言包异常确认系统字体安装完整,必要时在“语言”里切换设置

这张表不需要背,放在手边适配即可。实际开发中遇到报错,第一件事永远是看终端日志的完整输出,不要只看第一行或者只看弹窗摘要。很多问题日志里已经把答案写出来了。

7.1 CMAKE_PREFIX_PATH 的额外说明

如果是CMake构建的项目,Qt相关模块找不到时,通常需要在CMake配置里手动指定Qt路径:

cmake .. -DCMAKE_PREFIX_PATH=$HOME/Qt/对应版本/gcc_64

在Qt Creator里创建CMake项目时,也可以在“Build Environment”里把CMAKE_PREFIX_PATH这个变量加上。否则CMake会默认去系统目录里找Qt,找到的是旧的仓库版本,甚至会干脆找不到。

7.2 Qt版本切换的思路

多人协作的项目里,A开发者的机器上装的是Qt 5.15,B开发者可能要用Qt 6.5,这种版本不一致很容易搞崩。解决思路是:

不卸载任何版本,把所有Qt都装在同一根目录下(默认即可)。切换时只需在Kit设置里选不同的Qt版本即可。这是Qt官方安装器的天然优势,多个版本共存互不干扰。

唯一注意的是环境变量里PATH指向了某个版本的bin目录,命令行编译时会优先使用该版本。这台机器的默认命令行编译版本,建议和团队CI保持一致。

8. 关于离线部署和发布的一点经验

环境搭建完毕后,很多开发者的下一步就是把程序发布给别的机器用。这块虽然不是环境搭建本身,但和“搭建”是配套的。

Qt程序在UOS部署时,最怕的就是“这台机器能跑,那台机器装了就报错”。原因是Qt程序编译产物依赖很多动态库,目标机器上未必都有。发布部署时建议用ldd查看程序依赖,将缺失的库一并打包。也可以借助linuxdeployqt这类工具,把Qt依赖自动收集到程序目录里。

个人体验:尽量在UOS版本尽量接近的机器上做发布验证。不同版本UOS之间的库版本差异,比预想中要大很多。初次部署时报错,十有八九是系统库版本不一致造成的,而不是程序本身的问题。

最后说几句体己话

这套环境搭建的前前后后,我自己前前后后折腾过至少五六次。每次换机器、换项目、换Qt版本,都会遇到不一样的坑。总结下来最值钱的经验就三条:

第一,装Qt前先把系统依赖搞明白,不要急着跑安装器。很多问题不是Qt自己的问题,而是系统欠的账。

第二,环境变量和Kit配置要第一时间做对,否则后面每次编译都会反复踩同一个坑。

第三,保持耐心。在UOS这类系统上搭开发环境,和Windows上双击安装包完全不是一回事,每一步背后都有为什么。理解这些为什么之后,下次遇到问题你自己就能推出来解法。

如果你按这篇文章走一遍,中途还遇到其他奇怪问题,欢迎整理完报错日志后对照上表逐步排查。环境搭建这件事,本质上是个熟练活,跑通一次、理解一遍,之后就再也不慌了。

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进