ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

统信UOS下Qt 5.12.8离线安装指南:避开认证网络与GCC版本坑

统信UOS下Qt 5.12.8离线安装指南:避开认证网络与GCC版本坑 说实话在统信UOS上给Qt 5.12.8做离线安装要不是被逼急了真没人愿意折腾这活儿。当时我去客户现场部署一套数据可视化工具目标机器在办公网里外网访问要先弹一个您必须先登录此网络才能访问互联网的Portal认证页apt源全挂在线安装Qt Creator刚启动下载器就断连反复重试了三四次都没跑完。我当场就把在线方案毙了改成扛离线包进场才一口气把Qt环境搭干净。这篇就把这套离线安装流程完整写出来重点讲两个容易卡住的点认证网络导致的下载中断以及GCC版本选择引发的编译链路问题。适合正在UOS上做Qt开发、或者需要批量离线部署开发机的人参考。1. 环境确认与离线安装的整体思路1.1 为什么偏偏选Qt 5.12.8Qt版本很多但在统信UOS上做离线部署5.12.8算是非常理想的选择。首先是LTS版本官方维护周期长5.12.8是5.12系列后期维护版本稳定性经过大量生产环境验证。其次5.12.x还提供完整的离线安装包一个.run文件就把Qt库、Qt Creator、示例代码全带齐不需要额外从网上拉组件从5.15开始Qt官方把离线安装包策略改得很别扭不少组件必须走在线安装器这在无网络环境基本没法用。对于企业项目来说能离线下发、版本固定、依赖可控比追新版本重要得多。第三个原因是兼容性。统信UOS桌面版基于Debian系内核和工具链系统自带的GCC 8.3.0正好落在Qt 5.12.8官方测试过的编译器范围内不需要为了它专门升级编译环境。我在多个项目里用这套组合编译出来的程序在UOS 20系列上跑得很稳没有遇到版本不对付的玄学问题。如果你只是做常规桌面应用、工控界面、数据看板5.12.8完全够用。1.2 安装前必须确认的3件事拿到一台待部署的UOS机器别急着拷安装包先花两分钟把系统信息摸清楚后面能少踩很多坑。第一是CPU架构。多数办公机是x86_64架构但这两年国产化项目里aarch64ARM64的机器越来越多。直接在终端执行uname -m输出x86_64就选x86_64的Qt安装包输出aarch64就得找对应的ARM版本。我在现场就见过有人把x86的.run包拷到ARM机器上chmod之后双击没反应查半天才发现架构不对。第二是系统版本和root权限。执行cat /etc/os-release看版本号whoami确认当前用户。UOS桌面系统默认普通用户没有管理员权限有些操作需要sudo所以最好提前验证sudo echo test能不能顺利通过。如果sudo都不可用先去系统设置里开开发者模式或者用sudo passwd root给root设置密码再切过去否则后面dpkg装依赖包会很头疼。第三是磁盘空间。Qt 5.12.8完整安装大概会吃掉8GB到10GB如果还要装WebEngine模块空间需求会更大。安装前用df -h /opt看一眼根分区剩余容量我一般要求留足15GB以上免得装到一半磁盘满了安装器当场退出留下的残包还不好清理。1.3 网络登录问题的真实场景和处理策略标题里提到的网络登录主要是这类场景机器明明连着网线但打开浏览器访问任何网站都会跳到一个要求输入账号密码的认证页面提示您必须先登录此网络才能访问互联网。这是典型的Portal认证网络常见于办公楼、工厂园区、校园网和酒店网络。在这种网络里apt源连不通Qt在线安装器也连不通因为所有外部HTTP/HTTPS流量都会被重定向到认证服务器。判断方法很简单。终端执行curl -I http://www.baidu.com如果返回的是302跳转到一个登录网关IP说明流量被Portal劫持了。再执行apt update如果提示连不上archive域名那就基本确认是认证网络或纯粹无外网环境。遇到这种情况我的处理原则是不做在线挣扎全部改走本地离线流程。如果只是为了让Qt安装器跑起来临时用手机热点给机器开个网也行但后续依赖包、Qt模块下载还是会碰壁所以最靠谱的方案就是下面这套——把安装包和依赖都提前备好拷贝到目标机器全程不依赖外网。2. GCC版本选择最容易踩的坑2.1 Qt 5.12.8对编译器到底有多挑很多人在UOS上装完Qt编译Hello World都会报一堆莫名其妙的错误问题往往不是Qt本身而是GCC版本选错了。Qt在编译时会调用GCC处理C代码Qt 5.12.8官方建议的编译器范围是GCC 5.x到8.x最高兼容到9.x。如果GCC版本过低比如系统还停留在GCC 4.8那C11标准里很多特性用不了Qt源码编译到一半就会因为缺少std::regex这类标准库实现而报错如果GCC版本太高比如换成了GCC 11/12某些旧模块又可能因为编译器行为变化出现兼容性问题最常见的是链接阶段一堆undefined reference或者是-Wl参数识别异常。统信UOS 20桌面版默认的GCC版本是8.3.0恰好落在Qt 5.12.8最舒服的区间里。Qt官方在发布5.12.8时CI测试环境大量使用的就是GCC 8.3这一档所以用系统自带GCC是最不容易出幺蛾子的选择。我自己的原则很简单只要能编译项目绝不去动编译器大版本。2.2 为什么有人升级GCC后还是旧版本这年头网上教程动不动就让人先升级GCC说新版本编译快、兼容好。我在客户现场见过不止一个开发机系统里同时存在GCC 8.3和GCC 12用户明明跑过升级命令但gcc -v输出的还是8.3.0界面上的Qt Creator也识别不到新编译器于是开始怀疑人生。这背后基本是三个原因叠加。第一个是PATH顺序问题echo $PATH如果/usr/local/bin排在/usr/bin前面而新GCC装到了/usr/local/bin那可能新GCC被优先调用如果新版本是源码编译后默认装到/usr/local/bin但旧版本还在/usr/binwhich gcc看到的是哪个取决于PATH顺序。可很多时候用户跑完make install后没重新登录shell当前终端的PATH缓存还是旧的导致新版本没生效。第二个是符号链接残留问题/usr/bin/gcc这个软链接还指向旧版本目录即使是新版本已经安装但系统默认还是走到旧版本。第三个是update-alternatives没配置好GCC在Debian系里可以通过update-alternatives切换默认版本没设置的话系统始终用默认的8.3。2.3 正确检查当前GCC版本的方法在UOS上判断GCC版本我推荐按这个顺序来不要直接gcc -v就完事。which -a gcc gcc --version ls -l /usr/bin/gcc* sudo update-alternatives --config gccwhich -a gcc会列出所有出现在PATH中的gcc路径如果同时出现/usr/local/bin/gcc和/usr/bin/gcc说明系统里确实存在多版本。ls -l /usr/bin/gcc*能看出系统默认gcc软链接指向哪里。最后用update-alternatives --config gcc可以交互式切换默认编译器。基于这些排查我给大多数UOS开发者的建议是老老实实用系统自带的GCC 8.3.0。Qt 5.12.8在这个版本下编译最流畅没必要为了追求新版本给自己找麻烦。如果项目里确实有第三方库强制要求GCC 9以上那建议直接换Qt 5.15 LTS或者Qt 6而不是在5.12.8这条路上硬扛。3. 准备离线安装包这一步决定成败3.1 安装包从哪里拿最靠谱离线安装的核心准备工作就是把Qt 5.12.8的安装包完整地拿到手。安装包文件名通常是qt-opensource-linux-x64-5.12.8.run注意linux-x64表示x86_64架构如果是aarch64文件名通常带linux-arm64字样。下载渠道我按可靠性排序公司内部已经验证过的共享目录、官网存档区、可信镜像站。官网路径一般在download.qt.io/archive/qt/5.12/5.12.8/下面但很多办公网访问国际站点速度很慢我一般提前在能通外网的个人电脑上下载好再通过U盘或内网共享拷过去。一个容易被忽略的问题Qt 5.12.8安装包本身也有不同格式我们用的是OpenSource版本的离线run安装器不是在线版安装器。如果下载的是带online字样的安装器那它只是个壳运行时依然要联网下载组件在离线环境里就是个废物。3.2 下载后校验哈希防止文件损坏不要觉得下载完成就万事大吉。Qt官网下载页面会同时给出每个文件的SHA256校验值下载后务必校验一遍尤其是从内网共享目录或者第三方网盘拷贝的安装包。UOS上校验方法很简单sha256sum qt-opensource-linux-x64-5.12.8.run然后把输出的64位十六进制字符串和官网提供的SHA256值比对。我在实际项目里遇到过一个问题安装包从Windows机器拷过来中途U盘拔早了文件大小看起来差不多但安装器一跑就报错提示Could not find a valid Qt installation或者直接闪退。后来一校验才发现文件哈希对不上白白浪费了半个多小时。离线环境下排错成本高校验这一步一定不能省。3.3 提前把系统依赖包也准备好Qt安装器和编译环境还依赖一批系统库这是离线安装里最容易卡住的地方。在线环境下一条apt install就搞定离线后每缺一个包都得手动处理非常痛苦。我一般在搭建离线UOS环境时会在另一台能联网的同版本UOS机器上提前用apt-get download把需要的deb包抓下来。常用依赖包括apt-get download build-essential apt-get download gdb apt-get download libgl1-mesa-dev apt-get download libxcb-iccc4-dev libxcb-image0-dev libxcb-keysyms1-dev libxcb-randr0-dev libxcb-render-util0-dev libxcb-xinerama0-dev libxcb-xkb-dev apt-get download libxkbcommon-x11-0 libxcb-xinput0其中libgl1-mesa-dev是OpenGL开发支持编译Qt GUI程序基本必装一系列libxcb库是Qt在X Window环境下运行的依赖安装器界面能不能正常弹出来也跟它们有很大关系。把这些deb放在同一个目录到目标机器上统一执行sudo dpkg -i *.deb即可。如果提示依赖不足用sudo apt-get install -f修复前千万确认本地源或离线包能覆盖缺失项。我习惯同时把UOS安装镜像文件.iso留存一份挂载到机器上作为本地apt源。这样即使是离线状态也能安装大多数基础工具。挂载方式sudo mount -o loop UOS_V20.iso /mnt/uos_iso echo deb [trustedyes] file:///mnt/uos_iso stable main | sudo tee /etc/apt/sources.list.d/uos-local.list sudo apt update注意不同版本UOS的镜像源路径可能不同挂载后先ls /mnt/uos_iso看一下目录结构找到含dists的目录再配置。4. 离线安装全流程实操4.1 拷贝文件与安装依赖把Qt安装包和准备好的deb依赖拷到目标机器路径建议用纯英文不要放桌面或中文目录下。有些版本Qt安装器对中文路径支持不好会在解压临时文件时报编码错误。mkdir -p ~/offline_install cp /media/user/U盘/qt-opensource-linux-x64-5.12.8.run ~/offline_install/ cp /media/user/U盘/debs/*.deb ~/offline_install/ cd ~/offline_install sudo dpkg -i *.deb如果dpkg中途报错说某些包没装看具体名字再补对应deb。大部分情况是xcb相关库的依赖关系没理清实在不行就单独把报错缺的那个包名记下来再找对应版本拷进来。不要一上来就dpkg --force-all -i *.deb强行装完后面编译报错更难排查。4.2 授权并运行Qt安装器chmod x qt-opensource-linux-x64-5.12.8.run ./qt-opensource-linux-x64-5.12.8.runQt 5.12.8的安装器启动后如果之前依赖装得齐会正常弹出图形界面。这里要特别说一句5.12.8的安装器不强制要求登录Qt账号界面上虽然有账号登录栏但可以直接跳过不影响安装。离线环境下就算想登录也登不上千万别卡在账号密码界面浪费时间。如果安装器界面弹不出来通常是缺少X11运行库。可以先试试在终端设置环境变量再启动export QT_DEBUG_PLUGINS1 ./qt-opensource-linux-x64-5.12.8.runQT_DEBUG_PLUGINS会输出加载插件的详细日志能看到具体卡在哪个库。常见的是缺libxcb-xinerama0补装后再启动就好。还有一类情况是OpenGL加载失败安装器界面白屏可以用LIBGL_ALWAYS_SOFTWARE1强制走软件渲染先让界面出来。4.3 安装路径与组件选择Qt安装目录建议直接放在/opt/Qt5.12.8不要带空格或特殊字符不要装在用户目录下。原因有两点一是后续多用户共用一个Qt环境路径统一好管理二是很多自动化脚本、CI工具默认去/opt下找qmake省得配置时到处填路径。组件选择是减小体积、减少麻烦的关键。默认会选中很多用不到的模块对于桌面应用开发我一般这样勾选Qt 5.12.8下的Desktop gcc 64-bit全选或至少保留Qt Charts、Qt Data Visualization等业务需要的模块Tools下的Qt Creator必选Qt WebEngine这类大件除非项目明确需要离线环境下建议不装体积大且编译时还要额外依赖一堆库Android、iOS、WebAssembly组件统统不勾选完组件后点击Install整个安装过程大约需要10到20分钟取决于机器性能。装完后目录结构大概这样/opt/Qt5.12.8/ ├── 5.12.8/ │ └── gcc_64/ │ ├── bin/ │ ├── include/ │ ├── lib/ │ └── plugins/ └── Tools/ └── QtCreator/4.4 配置系统环境变量安装完成后需要在环境变量里把Qt的路径告诉系统。我通常在/etc/profile.d/下新建一个脚本这样所有用户登录后都能自动加载sudo vim /etc/profile.d/qt.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 export QT_PLUGIN_PATH$QTDIR/plugins这几个变量的作用分别是QTDIR让工具知道Qt安装根目录PATH加入qmake路径命令行直接能调起qmakeLD_LIBRARY_PATH确保程序运行时能找到Qt动态库QT_PLUGIN_PATH让Qt能找到平台插件比如xcb插件。保存后执行source /etc/profile.d/qt.sh或者重新登录终端运行qmake -v验证一下qmake -v如果输出类似QMake version 3.1和Using Qt version 5.12.8 in /opt/Qt5.12.8/5.12.8/gcc_64说明环境变量没配错。4.5 第一个命令行程序编译验证在不打开Qt Creator之前先用纯命令行把Qt编译链路验证通。写一个最简单的控制台程序#include QCoreApplication #include QDebug int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); qDebug() Qt offline install OK; return a.exec(); }然后编译运行qmake -project qmake make ./工程名如果看到Qt offline install OK说明链路已通。这一步如果报GL/gl.h not found说明缺OpenGL开发包补装libgl1-mesa-dev如果报cannot find -lGL则可能是库文件没链接需要把libGL.so软链接补上。这些细节看起来小但会直接卡住后面的图形界面程序编译。5. Qt Creator配置与常见坑5.1 手动添加编译器套件打开Qt Creator时它会自动检测系统里的GCC、GDB和qmake。我第一次打开时Qt Creator把编译器识别得很顺利因为系统GCC是8.3qmake也在路径里。但如果你手动调整过环境变量或者系统里有多版本GCCQt Creator很可能识别不到或者识别到但Kit标签显示红色警告这就需要手动添加。依次点击工具 - 选项 - Kits - 编译器 - 添加 - GCC - C编译器路径填/usr/bin/gcc再添加一个C编译器路径填/usr/bin/g。在调试器标签页添加GDB路径填/usr/bin/gdb。在Qt Versions标签页点添加选择qmake路径/opt/Qt5.12.8/5.12.8/gcc_64/bin/qmake。最后回到Kits页新建一个Kit三项分别选上去保存。这里我踩过的一个坑是如果机器上没装gdbQt Creator虽然能找到编译器但Debugger为空调试功能无法用。离线环境记得提前把gdb的deb包也准备好否则只能编译不能调试很尴尬。5.2 打开Qt Creator构建并运行第一个GUI程序新建项目时选择Application - Qt Widgets Application一路默认即可。构建时选择我们刚配置的Kit直接点运行。如果一切正常屏幕上会弹出一个空白窗口标题是项目名。如果构建时报cannot find -lGL说明在集成了OpenGL的支持时找不到libGL库。这个问题在全新UOS系统上很常见很多纯命令行系统没装图形开发库。解决办法是装上libgl1-mesa-dev或者检查/usr/lib/x86_64-linux-gnu/下有没有libGL.so文件没有的话手动建个软链接指向实际库文件。我遇到过装完libgl1-mesa-dev后依然报错的情况原因是系统里有多个libGL版本链接器选了错误的路径用find /usr -name libGL.so*排查后手动指定路径搞定。5.3 部署到另一台离线主机时的依赖检查项目在开发机上编译好了要部署到其他离线UOS机器很多人直接把可执行文件拷过去运行时缺库崩溃。Qt程序默认动态链接Qt库如果目标机器也有同一个Qt版本同时设置了LD_LIBRARY_PATH那问题不大如果目标机器没装Qt就需要把依赖库一起拷过去。我的做法是先在开发机上用ldd查看可执行文件的动态库依赖ldd ./你的程序看到带/opt/Qt5.12.8/5.12.8/gcc_64/lib路径的条目就是Qt库。把这些库连同程序一起拷贝再在目标机器上新建一个lib目录放置这些库启动时执行export LD_LIBRARY_PATH./lib:$LD_LIBRARY_PATH ./你的程序如果是发布给终端用户更规范的做法是用linuxdeployqt工具打包成AppDir目录结构生成一个免安装的文件夹双击直接运行但那是另一个话题这里先说清动态库依赖的方向即可。6. 常见问题与避坑速查表6.1 综合问题速查表汇总一下我在UOS离线安装Qt 5.12.8过程中遇到的高频问题按现象、原因、对策列出方便你查表定位现象原因对策浏览器弹“您必须先登录此网络”Portal认证网络无真实外网使用离线安装包不走在线安装流程apt update长时间无响应认证网络拦截外网流量改用本地iso源或离线deb包Qt安装器双击后没反应x86与arm架构安装包不匹配uname -m确认架构换对应安装包安装器启动白屏或闪退缺少XCB相关系统库补装libxcb-*系列deb包安装器卡在登录界面误以为必须登录Qt账号5.12.8可直接跳过登录点Skip安装到一半磁盘满分区预留空间不足先df -h检查清理磁盘或换安装路径gcc -v显示旧版本多版本共存且切换未生效which -a gcc定位用update-alternatives切换编译报GL/gl.h not found缺OpenGL开发头文件安装libgl1-mesa-dev编译报cannot find -lGLlibGL软链接缺失或连接错误查找libGL.so位置并建立软链接Qt Creator未识别编译器PATH未更新或版本配置混乱手动添加GCC/GDB/qmake到Kit程序拷到其他机器运行报缺库动态库依赖没带全用ldd检查依赖连同Qt库一并部署安装器提示无法创建临时文件/tmp空间不足或中文路径问题清理/tmp安装包放纯英文路径6.2 两个大坑的详细复盘第一个坑是认证网络下的反复尝试。第一次在客户现场我以为Portal认证网络只是浏览器层面的限制终端走代理或者配置一下DNS就能绕过去。实际折腾了快一个小时发现所有外网流量都会被动重定向到认证服务器技术手段很难绕过而且就算手动输入了认证账号网络策略也只放行浏览器流量命令行下的apt照样连不上。最终放弃在线方案直接用离线包整个过程反而顺畅。所以我现在遇到类似网络第一反应就是离线安装不纠结。第二个坑是GCC升级残留。某个项目要求部分模块必须用GCC 11编译我就在UOS上装了一个新版GCC装完发现全局gcc还是老版本。检查后发现新版GCC被装到了/opt/gcc-11/bin而PATH里/usr/bin排在它前面导致shell永远优先找到老版本。后来我把/opt/gcc-11/bin加到PATH最前面并且在~/.bashrc里明确指定版本号才把这个混乱局面收拾干净。从那以后我强烈建议在UOS上做Qt 5.12.8开发时不要动系统默认GCC多版本GCC用update-alternatives来切换避免环境变量互相污染。6.3 离线环境下的几个小技巧最后分享几个离线环境的小技巧都是实际验证过的。在联网的UOS机器上提前把所需deb包全部下到本地时可以用一条命令批量下载省得一个个敲apt-get download $(apt-cache depends --recurse --no-recommends --no-suggests --no-conflicts --no-breaks --no-replaces --no-enhances build-essential | grep ^\w | sort -u)这样会把build-essential相关的所有依赖包递归列出来并下载拷到离线机器后一次性dpkg -i *.deb基本能过。Qt安装完成后如果还有多台同配置机器要部署不必每台都跑安装器。在一台标准机器上把/opt/Qt5.12.8目录完整打包到目标机器上解压再复制一份/etc/profile.d/qt.sh即可快速复用。前提是真机架构、系统版本一致否则库文件不兼容。最后再分享一个我现在一直沿用的办法在一台已经装好的UOS机器上把/opt/Qt5.12.8整个目录打包成tar再拷到目标机器直接解压配合写好的环境变量脚本能省掉安装器界面依赖、登录页面等一堆问题。这套路我在十几台机器上验证过比每次现场跑安装器稳得多。如果你打算批量部署研发环境强烈建议按这个思路来做。离线环境安装Qt这件事本质上就是“提前把路铺好现场少折腾”准备越充分踩坑越少。
返回列表