如果你在统信UOS上装过Qt,大概率也在在线安装器上栽过跟头。我这个月刚把开发机从Ubuntu迁到UOS V20,装Qt 5.12.8的时候连续踩了两个坑:一个是打开安装器直接卡在一个“必须先登录此网络才能访问互联网”的页面,另一个是装完之后用系统自带的GCC编译Qt项目,版本对不上、依赖库各种报错。这两件事折腾了两天,最后换离线安装包、固定GCC版本才顺利跑通。
这篇就把完整流程整理成保姆级教程,从离线安装包怎么找、GCC版本怎么选、缺库怎么补,到安装完成后qmake怎么配环境变量,全部按我实际操作的顺序来写。适合在国产Linux环境里做Qt开发的同学,也适合需要在内网批量部署Qt开发环境、手上又只有一台不能随意联网机器的运维朋友。照着这个流程走,能省下大量试错时间。
1. 项目整体思路与避坑点前置说明
1.1 为什么这次必须走离线路线
先说第一个坑。我一开始用的Qt在线安装器(qt-unified-linux-x64-online.run),这个安装器启动后会先请求Qt账号登录页,目的是拉取远程的组件列表。问题就出在这里:公司内网访问外网需要先通过一个网络认证页面,浏览器一旦弹不出来,Qt安装器就一直停在初始化的状态,报错信息还特别模糊,只提示连接失败。
更麻烦的是,就算你的网络能打开网页,Qt在线包的下载服务器在国外,下载速度极不稳定,安装到一半断掉也是常有的事。在需要内网隔离、无法访问外网的环境里,在线安装基本就是死路一条。
所以我这次直接放弃在线安装器,改用Qt 5.12.8的离线安装包(qt-opensource-linux-x64-5.12.8.run)。离线包的好处非常明显:它把组件内容都打包在文件里,安装过程不联网、不登录、不拉取远程数据,装完就能用。整套流程和你去药店买盒装感冒药一样,拆开就能吃,不用先挂号问诊。
1.2 Qt 5.12.8 在统信UOS上的特殊定位
统信UOS V20桌面本身是基于Qt 5技术栈构建的,系统里其实已经带了不少Qt5运行时组件。很多同学看到系统里有libQt5Widgets、libQt5Core这些库,以为Qt已经装好了,直接用就行,结果一敲qmake,提示找不到命令,再一查头文件,发现/usr/include里也没有Qt的相关目录。
原因是系统自带的只是Qt运行时库,作用是让桌面程序能跑起来,不是完整的Qt开发环境。开发者需要的qmake、moc、头文件、模块库、Qt Creator这些,一套完整的SDK都没装。所以在UOS上装Qt,不能想当然地跳过。
为什么推荐5.12.8而不是更新的版本?一方面因为这个版本是Qt 5.12 LTS系列里的稳定维护版,企业项目使用率很高;另一方面统信UOS的桌面组件对Qt 5.12系列适配得比较成熟,相关的动态库依赖在系统里基本都有,后续补依赖的坑会少很多。5.15虽然也常用,但在老一些的UOS版本上,个别模块的依赖缺口更大,对离线安装不算友好。
1.3 准备物料清单
在开始动手之前,先把需要准备的东西列清楚,避免装到一半发现缺这个缺那个。
| 物料 | 说明 | 来源 |
|---|---|---|
| Qt 5.12.8 离线安装包 | qt-opensource-linux-x64-5.12.8.run,约1.3GB | 官方archive或国内镜像 |
| GCC工具链 | 建议使用系统自带的GCC 8.3.1 | UOS自带 |
| 基础开发依赖 | g++、make、libc6-dev、binutils | UOS软件源或预下载deb |
| 运行库 | libGL、libxcb等 | UOS软件源或预下载deb |
| U盘或内网传输通道 | 用于把安装包拷贝到目标机器 | 按实际情况准备 |
2. 离线安装包获取与校验
2.1 官方下载与国内镜像地址
Qt 5.12.8的离线安装包可以从几个渠道获取。官方archive的地址是download.qt.io,目录路径为archive/qt/5.12/5.12.8/qt-opensource-linux-x64-5.12.8.run。这个地址在浏览器里直接访问即可,不需要登录。
不过官方服务器在境外,国内直连速度不稳定。建议优先用国内镜像:清华大学的mirrors.tuna.tsinghua.edu.cn、中国科学技术大学的mirrors.ustc.edu.cn、阿里云的mirrors.aliyun.com,路径和官方保持一致,都是/qt/archive/qt/5.12/5.12.8/qt-opensource-linux-x64-5.12.8.run。
下载的时候注意文件名,别下成在线安装器。在线和离线这两个文件名看起来很像,实际上差别很大。在线安装器是几百兆的小文件,离线包是1.3GB左右的大文件。如果你看到下载下来的文件只有一两百MB,而且文件名里带online字样,那就是下错了。
2.2 从已有机器直接拷贝整套目录
如果连镜像站也访问不了,还有一个更省事的路子:找一台已经装好Qt 5.12.8的相同架构Linux机器,把整个Qt安装目录打成压缩包拷过来。
Qt的安装目录结构是自包含的,不像某些软件需要写注册信息。我在多台机器上验证过,只要系统架构一致(比如都是x86_64),glibc版本相近,直接解压到目标机器就能用。
打包命令:
tar -czf qt5128.tar.gz /opt/Qt5.12.8到目标机器上解压:
sudo tar -xzf qt5128.tar.gz -C /opt/这种方式部署速度最快,适合在内网同时给几十台机器装环境的场景。缺点是你得有现成的安装好的机器,一般手上有开发机的同学都能满足这个条件。注意压缩包里要把整个Qt目录完整保留,特别是5.12.8/gcc_64和Tools这两个目录不能少,Tools目录里装了Qt Creator和编译工具链。
2.3 下载后的完整性校验
不管从哪里下载,装之前都要校验一下包的完整性。一个简单又可靠的办法是比对SHA256哈希值。
sha256sum qt-opensource-linux-x64-5.12.8.run然后去官网或者镜像站的MD5SUMS、SHA256SUMS文件里查对应的值。如果哈希对不上,说明下载过程中文件损坏了,装到一半很可能报错退出。
我见过有人不看哈希,下载完直接运行,结果安装器在解包阶段报“archive is corrupted”,折腾半天才发现是下载不完整。下载大文件这种事,多花十秒钟校验能避免半个小时的麻烦。
3. GCC 版本选择与依赖准备
3.1 先查一下系统当前的编译器
Qt安装包里自带了编译套件,但真正编译你项目代码的是系统里的GCC和G++。版本不匹配会导致编译错误或者编译出来的程序运行异常。
在UOS上先执行这几条命令看现状:
uname -m gcc --version g++ --version统信UOS V20系列默认自带的GCC是8.3.1,这个版本对Qt 5.12.8来说完全够用。Qt官方对GCC的要求是最低4.8.2,编译Qt库本身以及Qt项目都是在这个版本基础上验证过的。所以如果机器上已经是8.3.1,不需要做任何升级操作,直接用就行。
这里有一个常见的认知偏差:有人觉得编译器版本越新越好,于是手动下载了GCC 11或者12装到系统里,结果编译Qt项目时反而报了一堆ABI兼容问题。实际上Qt 5.12.8发布年代对应的GCC工具链就是8.x左右,你拿太新的编译器去编老项目,标准库头文件的变化就可能让你多出几十个编译错误。
3.2 GCC版本兼容性快查
| GCC版本 | Qt 5.12.8支持程度 | 说明 |
|---|---|---|
| 4.8.2 | 支持 | 最低要求 |
| 5.x | 支持 | 可用 |
| 6.x-8.x | 推荐 | 最佳匹配区间 |
| 9.x-10.x | 基本可用 | 个别旧项目可能遇到C++标准差异 |
| 11及以后 | 不推荐 | ABI变化大,老项目编译容易出问题 |
如果你要编译的项目是多年积累的老代码,建议GCC保持系统默认版本,不要升级。如果你确实需要多个GCC版本共存,用update-alternatives管理,而不是直接替换系统的默认gcc命令。
3.3 离线环境下的依赖包怎么备齐
离线安装最大的麻烦不是Qt安装包,而是系统依赖。好在UOS自带软件源里就有大部分需要的包,问题在于你的目标机器可能根本连不上软件源。
我的做法是在一台可以联网的同版本UOS或者Debian 10机器上,提前用apt-get download把需要的deb包下载下来。
mkdir gcc-debs && cd gcc-debs apt-get download gcc g++ make libc6-dev binutils dpkg-dev然后把整个目录拷到目标机器,用dpkg安装:
sudo dpkg -i *.debdpkg安装deb包时如果报依赖错误,说明还有包没下全。这时可以通过apt的模拟安装来补齐:
apt-get install --print-uris g++这个命令会把g++以及所有依赖包的下载链接打出来,你在联网机器上把这些URL对应的deb包挨个下载,凑齐之后再搬过去。虽然麻烦,但在完全隔离的内网里这是最靠谱的办法。
3.4 为什么装完新GCC后版本还是没变
有同学会碰到这种情况:明明apt install gcc显示已经是最新版本,或者手动编译安装了新版本的GCC,但执行gcc --version看到的还是旧版本号。这个问题我也踩过,原因一般有这几种:
一是命令路径不对。用type -a gcc看看执行的是哪个路径下的gcc。如果有/usr/local/bin/gcc和/usr/bin/gcc两套并存,默认PATH里/usr/local/bin优先,那执行到的可能是你自己编译的版本,但因为没有正确安装头文件和库,导致编译器自己报版本不对。
二是shell的hash缓存。同一个命令你之前执行过,bash会把路径缓存起来,新装的命令可能被缓存挡住了。执行hash -r清一下缓存就能解决。
三是update-alternatives的软链接没切换。用update-alternatives --config gcc手动选一下默认版本,适合系统里同时存在多个GCC的场景。
4. 安装实操流程:从放包到qmake跑通
4.1 拷贝安装包并赋予执行权限
把下载好的qt-opensource-linux-x64-5.12.8.run拷贝到目标机器上,我习惯放到家目录或者/opt目录下,路径不要带中文和空格,避免安装器解包时出问题。
给安装包加执行权限:
chmod +x qt-opensource-linux-x64-5.12.8.run然后运行它:
./qt-opensource-linux-x64-5.12.8.run如果是在SSH远程连接的环境,你需要确保DISPLAY环境变量已经指向有效的X11显示,比如本地Xshell开了X11转发,或者在UOS图形桌面终端里直接执行。纯SSH看不到图形界面的话,后面会说静默安装的方法。
4.2 图形界面安装的关键步骤
安装器打开后,界面上会有欢迎页和协议页,直接下一步。安装路径默认是用户主目录下的Qt5.12.8,我建议改成/opt/Qt5.12.8,原因是多用户共用开发机时,装到/opt下所有用户都能引用,不会因为某个用户的目录权限对不上导致编译脚本找不到qmake。
组件选择页是重点。默认全选的话,安装体积会大很多,包含Android模块、iOS模块等一堆你用不到的东西。在UOS上做桌面开发,至少保留这几个组件:
- Qt 5.12.8 下的 Desktop gcc 64-bit,这是核心SDK
- Qt Creator,集成开发环境
- Qt Debug Information Files,调试符号,排查崩溃时有用
- Qt Charts、Qt Data Visualization 这类按项目需要勾选
安装时间取决于磁盘性能,一般10到20分钟。全程不需要联网,也不会弹登录窗口。我装的时候特意看了网络连接状态,流量面板纹丝不动,彻底绕开了之前那个“必须先登录此网络才能访问互联网”的坑。
4.3 无桌面环境时的静默安装方式
如果你是通过SSH维护一台没有图形界面的UOS服务器,或者想在几十台机器上批量安装,就得用静默安装模式。Qt安装器支持通过JS脚本控制安装过程。
先写一个安装脚本qt-installer-noninteractive.qs:
function Controller() { installer.autoRejectMessageBoxes(); installer.installationFinished.connect(function() { gui.clickButton(buttons.FinishButton); }); }然后运行安装器时指定脚本和minimal平台:
./qt-opensource-linux-x64-5.12.8.run --script qt-installer-noninteractive.qs --platform minimal --verboseminimal平台会避免加载xcb等图形平台插件,纯命令行环境下也能跑。注意这个模式会默认安装全部组件,安装体积较大,装完大概占10GB以上空间。要精简组件的话,需要在脚本里手动设置安装组件列表,这里就不展开,有兴趣的可以研究一下Qt Installer Framework的脚本API。
4.4 环境变量配置与qmake验证
安装完成后,最重要的一步是配置环境变量。如果不配置,每次都要敲/opt/Qt5.12.8/5.12.8/gcc_64/bin/qmake才能调用qmake,很多集成环境也找不到Qt路径。
我习惯在/etc/profile.d/下建一个专门的脚本,这样所有用户登录时都会自动加载:
sudo vim /etc/profile.d/qt5.sh写入:
export QTDIR=/opt/Qt5.12.8/5.12.8/gcc_64 export PATH=$QTDIR/bin:$PATH export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH保存后执行:
source /etc/profile.d/qt5.sh验证是否生效:
qmake -v正常情况下会输出:
QMake version 3.1 Using Qt version 5.12.8 in /opt/Qt5.12.8/5.12.8/gcc_64/lib看到这个输出,Qt环境就算真正可用了。
5. 常见问题与排查技巧实录
5.1 安装/运行阶段最典型的几个报错
先整理一份报错速查表,都是我在UOS上实际遇到或者帮同事处理过的。
| 报错现象 | 可能原因 | 解决方法 |
|---|---|---|
| error while loading shared libraries: libGL.so.1 | 系统缺OpenGL库 | sudo apt install libgl1 libgl1-mesa-dev |
| Could not load the Qt platform plugin "xcb" | xcb相关依赖缺失 | sudo apt install libxcb-xinerama0 libxcb-icccm4 libxcb-keysyms1 libxcb-shape0 |
| error: g++: command not found | 没装g++编译器 | sudo apt install g++ |
| GLIBCXX_3.4.XX not found | 编译器运行时库版本过旧 | 检查gcc/g++版本,必要时升级libstdc++ |
| qmake: command not found | PATH没配置或没source | 检查环境变量配置,重新source |
libGL这个错误几乎是必踩的,尤其是精简安装的UOS系统。Qt的GUI程序启动时要加载OpenGL库,系统如果没有预装图形驱动相关的开发库就会报这个错。别慌,直接apt装一下就能解决,但前提还是你的软件源可用,否则就得参考第3.3节提前把deb包备好。
5.2 装完后Qt Creator打不开怎么办
安装过程一切正常,Qt Creator双击图标却启动不了,屏幕上一闪而过或者干脆没反应。这种情况先到命令行手动启动,看具体报错:
/opt/Qt5.12.8/Tools/QtCreator/bin/qtcreator如果是用root用户执行,十有八九会遇到沙箱相关的报错,Qt Creator内置的WebEngine组件在root权限下默认不允许启动沙箱。解决办法是设置环境变量:
export QTWEBENGINE_DISABLE_SANDBOX=1如果你是通过SSH远程访问,还会遇到DISPLAY环境变量为空的情况。Qt Creator作为图形程序必须要能连到X server,本地登录UOS桌面没问题,远程SSH就要用X11转发,或者在UOS的远程桌面工具里操作。
5.3 编译器在Qt Creator里配置不生效
Qt Creator打开后,在工具-选项-Kits里可能显示编译器为None,无法自动识别GCC。这时候手动指定一下编译器路径就行。
GCC路径一般是/usr/bin/gcc,G++路径是/usr/bin/g++,gdb路径是/usr/bin/gdb。Qt Creator会自动探测这些路径,偶尔探测失败就手动填。还有一个容易忽略的点:如果你配置了多个版本的GCC,Kits里选了某个Kit,但项目构建时用的还是旧的,大多数情况是CMake cache没清理。删掉build目录重新构建就能解决。
5.4 卸载与目录迁移
离线包安装的Qt没有统一的卸载工具,我试过直接运行安装器目录下的MaintenanceTool,但离线安装的情况下它有时候能用有时候不行。最干净的方式就是删除安装目录:
sudo rm -rf /opt/Qt5.12.8同时把/etc/profile.d/qt5.sh里的环境变量相关配置删掉,避免PATH里残留无效路径。
如果你想把Qt从一台机器迁到另一台,直接拷贝整个目录即可,这也是我在第2.2节说过的路子。迁移后记得检查一下目录的属主和权限:
sudo chown -R yourname:yourname /opt/Qt5.12.8不然用普通用户打开Qt Creator,会因为没有目录写权限导致无法创建构建缓存。
最后再分享一个批量部署的小经验:如果你需要给团队里十几台机器统一装环境,不要一台台跑安装器,在一台基准机上装好Qt,配置好环境变量,然后把整个目录连同环境配置脚本打成包,分发到其他机器解压,全程不需要动网络。我有个项目组就这么干,原来一台上手要40分钟,后来十分钟就能交付一台能正常编译Qt项目的机器。
统信UOS上装Qt 5.12.8这件事,本身难度不高,但每一步都有容易踩的暗坑。网络登录问题用离线包解决,GCC版本问题用系统自带8.3.1解决,缺依赖库的问题用提前备份deb包解决。把这三点想清楚,整个安装过程就会非常顺利。希望这篇教程能帮你少走一些弯路。