1. 麒麟V10下Qt开发环境搭建的整体思路
在麒麟V10操作系统上折腾Qt开发环境,这件事本身不算复杂,但真正踩过坑的人都知道,问题从来不在“装不上”,而在“装完之后编译报错、模块找不到、版本对不上”。我前后在麒麟V10的x86_64平台上部署过不下十套Qt环境,从Qt 5.9一直用到Qt 5.15.2,也帮同事处理过各种稀奇古怪的编译问题。这篇文章就把整个流程和常见坑一次性讲清楚,让你少走弯路。
麒麟V10(银河麒麟桌面操作系统V10/高级服务器操作系统V10)本质上是基于Linux内核的国产发行版,x86_64架构下它的包管理体系和常见的RPM系发行版比较接近,但又做了不少定制。Qt作为跨平台C++应用开发框架,在这个系统上的安装方式主要有三种:系统源直接安装、官方离线安装包安装、源码编译安装。三种方式各有适用场景,选错了后面会非常痛苦。
这篇文章适合谁看?如果你是刚接触麒麟V10的Qt开发者,或者之前在Ubuntu上写Qt代码很顺手、换到麒麟V10后突然各种报错的同行,再或者你需要在麒麟V10上部署Qt开发环境给团队用,那这篇内容基本能覆盖你90%的需求。我会从方案选型讲起,然后一步步走完安装流程,最后重点放在编译问题的排查上——这部分才是真正花时间的地方。
先说一个核心结论:在麒麟V10 x86_64上,优先选择Qt官方离线安装包,版本锁定在5.15.2或5.14.x,不要轻易用系统源里的Qt版本,也不要一上来就源码编译。这个结论背后的逻辑,后面会详细展开。
2. 安装方案选型与版本决策
2.1 三种安装方式的对比与选择逻辑
很多人拿到一台麒麟V10机器,第一反应是apt install qt5-default或者yum install qt5-qtbase-devel,觉得这样最省事。但在麒麟V10上,这个操作往往会带来一系列问题。系统源里的Qt版本通常比较旧(比如5.9或5.11),而且不同模块的版本可能不一致,更麻烦的是,麒麟V10的源里Qt开发包不一定齐全,serialport、multimedia这些模块经常缺失。
我把三种方式的优缺点整理成了一张表,你可以对照自己的情况选:
| 安装方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 系统源安装 | 命令简单,依赖自动处理 | 版本旧、模块不全、版本不一致 | 只做简单测试,不推荐正式开发 |
| 官方离线安装包 | 版本可控、模块齐全、安装快 | 需要手动下载、部分依赖需自行补齐 | 绝大多数开发场景首选 |
| 源码编译 | 可深度定制、可裁剪 | 耗时长、依赖复杂、容易失败 | 有特殊定制需求或嵌入式场景 |
我个人的建议很明确:除非你有明确的定制需求,否则一律走官方离线安装包路线。Qt 5.15.2是LTS版本,官方离线包对x86_64支持完善,安装过程基本是下一步下一步,省心。
2.2 为什么锁定Qt 5.15.2而不是更高版本
Qt 6系列虽然新,但在麒麟V10上会遇到更多兼容性问题。Qt 6对C++17的强制要求、对CMake版本的依赖、对系统glibc版本的要求,在麒麟V10上都可能成为拦路虎。而Qt 5.15.2是Qt 5系列的最后一个LTS版本,稳定性经过大量项目验证,社区资料也最丰富。
另外,很多工业软件、上位机项目、嵌入式HMI都还在用Qt 5.15.x,你选这个版本,后续对接第三方库、找参考资料都会顺畅很多。Qt 5.14.x也可以,但5.15.2的bug修复更完整,优先选它。
注意:下载离线安装包时,一定要选
qt-opensource-linux-x64-5.15.2.run这个文件,不要选带android或ios后缀的,那些是特定平台专用包。
2.3 安装前的系统准备与依赖检查
在正式安装之前,有几项系统层面的准备工作必须做,否则安装过程中或安装后会出问题。
第一,确认系统架构和版本。执行:
uname -m cat /etc/os-release输出应该是x86_64,以及类似Kylin Linux Advanced Server V10的信息。确认是x86_64而不是aarch64,这决定了你下载哪个安装包。
第二,安装必要的系统依赖。Qt运行时需要一些基础库,虽然离线包会自带大部分,但有几个系统级的依赖建议提前装好:
sudo yum install -y mesa-libGL-devel mesa-libGLU-devel libxcb-devel libxkbcommon-devel sudo yum install -y fontconfig-devel freetype-devel libpng-devel sudo yum install -y dbus-devel glib2-devel这些包分别对应OpenGL渲染、XCB窗口系统、字体渲染、D-Bus通信等基础能力。缺了它们,Qt Creator可能启动黑屏,或者编译出的程序运行时报cannot find -lGL之类的错误。
第三,检查磁盘空间。Qt 5.15.2完整安装大约需要5-8GB空间,建议/opt或你打算安装的目录至少有15GB可用空间。用df -h看一眼就行。
第四,如果你之前装过系统源的Qt,建议先清理掉,避免环境变量冲突:
sudo yum remove -y qt5-* qt-*这一步不是必须的,但如果你之前折腾过系统源Qt,清理一下能省掉后面很多“为什么找到了错误的qmake”这类问题。
3. Qt离线安装包安装实操全流程
3.1 下载与校验安装包
Qt官方离线安装包现在需要通过账号登录才能下载,如果你没有账号,也可以从一些国内镜像站获取。下载完成后,第一件事是校验文件完整性:
chmod +x qt-opensource-linux-x64-5.15.2.run md5sum qt-opensource-linux-x64-5.15.2.run把得到的MD5值和官方公布的对比,一致才继续。这一步很多人跳过,但下载不完整导致的安装失败非常隐蔽,校验一下能省很多事。
3.2 图形化安装步骤与组件选择
给安装包执行权限后,直接运行:
./qt-opensource-linux-x64-5.15.2.run如果当前是纯命令行环境,没有图形界面,需要先确保X11转发或者在有桌面的环境下操作。麒麟V10桌面版直接双击运行也行。
安装向导里几个关键选择:
- 安装路径:建议改成
/opt/Qt5.15.2,不要用默认的用户目录,方便多用户共享。 - 组件选择:在
Qt 5.15.2节点下,至少勾选Desktop gcc 64-bit。如果你要做Android开发,再勾Android相关组件。Sources和Qt Charts、Qt Data Visualization这些按需勾选。 - Additional Libraries:
Qt Serial Port、Qt Multimedia这些常用模块记得勾上,不然后面编译报Unknown module(s) in QT: serialport就是这里没选。
安装过程大约10-20分钟,取决于磁盘速度。安装完成后,Qt Creator会在/opt/Qt5.15.2/Tools/QtCreator/bin/下。
3.3 环境变量配置与验证
安装完不配环境变量,命令行里用qmake会找不到。编辑~/.bashrc或/etc/profile,加入:
export QTDIR=/opt/Qt5.15.2/5.15.2/gcc_64 export PATH=$QTDIR/bin:$PATH export LD_LIBRARY_PATH=$QTDIR/lib:$LD_LIBRARY_PATH export QT_PLUGIN_PATH=$QTDIR/plugins保存后执行source ~/.bashrc,然后验证:
qmake -v应该输出QMake version 3.1和Using Qt version 5.15.2。如果输出的版本不对,说明PATH里有其他qmake,用which -a qmake查一下,把旧的清理掉。
再验证一下Qt Creator能否正常启动:
qtcreator &如果界面正常弹出,说明基础环境没问题。如果报错缺库,根据提示补装对应的-devel包即可。
实操心得:我习惯把Qt环境变量写在一个单独的脚本
qt-env.sh里,需要时source一下,而不是直接写进.bashrc。这样在多版本Qt切换时特别方便,不会互相干扰。
4. 常见编译问题深度排查
4.1 Unknown module in Qt: serialport 类问题
这是麒麟V10上最高频的编译错误之一。你在.pro文件里写了QT += serialport,结果qmake报:
Project ERROR: Unknown module(s) in QT: serialport原因通常有三个:一是安装时没勾选Qt Serial Port模块;二是qmake找到的是系统源的Qt而不是你安装的Qt;三是模块装了但qmake的mkspecs路径没包含进去。
排查顺序:先qmake -v确认版本和路径,再检查$QTDIR/lib/cmake/Qt5SerialPort目录是否存在。如果目录不存在,说明模块没装,重新运行安装包补装即可。如果目录存在但还报错,检查.pro文件里模块名大小写,Qt的模块名是大小写敏感的,serialport不能写成SerialPort。
补装模块的方法:重新运行.run安装包,它会检测已安装组件,你勾选缺失的模块,它会增量安装,不用全部重来。
4.2 cannot find -lGL 与 OpenGL链接错误
编译时报:
cannot find -lGL collect2: error: ld returned 1 exit status这是缺少OpenGL开发库。麒麟V10上执行:
sudo yum install -y mesa-libGL-devel mesa-libGLU-devel如果装完还报错,检查/usr/lib64/libGL.so是否存在。有些麒麟V10版本默认只装了运行时库libGL.so.1,没有开发用的软链接。可以手动创建:
sudo ln -s /usr/lib64/libGL.so.1 /usr/lib64/libGL.so但更规范的做法是装mesa-libGL-devel,它会自动处理好这些链接。
4.3 中文输入与字体显示异常
Qt程序在麒麟V10上跑起来后,中文显示成方块,或者输入法切不出来。这是字体配置问题。麒麟V10默认的字体路径在/usr/share/fonts/下,Qt会去读fontconfig的配置。
解决方法:确认fontconfig和freetype开发包装了,然后在程序里显式设置字体:
QFont font("WenQuanYi Micro Hei", 10); qApp->setFont(font);如果系统里没有中文字体,装一个:
sudo yum install -y wqy-microhei-fonts输入法方面,麒麟V10通常用fcitx或ibus,Qt程序需要对应的输入法插件。检查$QTDIR/plugins/platforminputcontexts/下是否有libfcitxplatforminputcontextplugin.so或libibusplatforminputcontextplugin.so。没有的话,从系统源装fcitx-qt5或ibus-qt,然后把插件拷到Qt插件目录。
4.4 qmake版本冲突与多版本共存
机器上装了多个Qt版本时,qmake指向哪个版本经常出问题。表现是:Qt Creator里编译正常,命令行qmake && make就报奇怪的错。
核心原则:永远用绝对路径调用qmake,或者在项目目录下用/opt/Qt5.15.2/5.15.2/gcc_64/bin/qmake。Qt Creator里在Kits设置中明确指定Qt版本路径,不要用Auto-detect。
如果确实需要多版本共存,用qtchooser管理:
qtchooser -list-versions qtchooser -install qt5.15.2 /opt/Qt5.15.2/5.15.2/gcc_64/bin/qmake export QT_SELECT=qt5.15.2这样切换版本就干净很多。
4.5 常见编译问题速查表
| 错误信息 | 根本原因 | 解决方法 |
|---|---|---|
| Unknown module(s) in QT: serialport | 模块未安装或qmake路径错误 | 补装模块,确认qmake版本 |
| cannot find -lGL | 缺OpenGL开发库 | 装mesa-libGL-devel |
| GL/gl.h: No such file | 缺GL头文件 | 同上 |
| 中文显示方块 | 缺中文字体 | 装wqy-microhei,程序设字体 |
| 输入法无法切换 | 缺输入法插件 | 装fcitx-qt5,拷插件 |
| version `GLIBCXX_3.4.xx' not found | GCC版本不匹配 | 统一编译器和运行库版本 |
| cannot find -lpthread | 链接顺序问题 | .pro里加LIBS += -lpthread |
5. 项目构建与部署的进阶经验
5.1 .pro文件的关键配置项
一个在麒麟V10上稳定工作的.pro文件,通常需要包含这些配置:
QT += core gui widgets serialport network CONFIG += c++11 TARGET = myapp TEMPLATE = app QMAKE_CXXFLAGS += -fPIC QMAKE_LFLAGS += -Wl,-rpath,'$$ORIGIN/lib' unix:!macx { LIBS += -lpthread -ldl }-fPIC在x86_64上编译动态库时经常需要,不加可能报relocation R_X86_64_PC32错误。-Wl,-rpath,'$$ORIGIN/lib'让程序运行时去自己目录下的lib找库,部署时特别有用,不用配LD_LIBRARY_PATH。
5.2 发布程序的依赖打包
Qt程序编译完,直接拷到别的麒麟V10机器上跑,大概率报缺库。用ldd查依赖:
ldd myapp | grep "not found"打包时,把Qt的库和插件一起带上。我通常用这个脚本:
mkdir -p release/lib release/plugins/platforms cp myapp release/ cp /opt/Qt5.15.2/5.15.2/gcc_64/lib/libQt5*.so.5 release/lib/ cp /opt/Qt5.15.2/5.15.2/gcc_64/plugins/platforms/libqxcb.so release/plugins/platforms/然后在程序目录建一个启动脚本,设置LD_LIBRARY_PATH和QT_PLUGIN_PATH指向相对路径。这样整个目录拷到任何麒麟V10 x86_64机器上都能跑。
5.3 麒麟V10特有的兼容性注意点
麒麟V10的某些版本对/tmp目录的权限做了限制,Qt程序如果用QTemporaryFile可能会失败。遇到这种情况,在程序启动时设置:
qputenv("TMPDIR", "/var/tmp");另外,麒麟V10的SELinux策略可能阻止Qt程序访问某些路径。如果程序莫名无法读写文件,先检查/var/log/audit/audit.log,或者临时用setenforce 0测试(生产环境不要长期关闭)。
还有一个坑:麒麟V10服务器版默认没有图形界面,如果你在服务器版上装Qt Creator,需要先装桌面环境或者用X11转发。纯命令行下用qmake && make编译是没问题的,但Qt Creator跑不起来。
6. 实操中踩过的坑与独家建议
6.1 安装包运行报“无法执行二进制文件”
有时候下载的.run文件执行时报:
bash: ./qt-opensource-linux-x64-5.15.2.run: 无法执行二进制文件这通常是因为文件没有执行权限,或者下载的是aarch64版本而你在x86_64上跑。先chmod +x,再file命令看一下文件架构:
file qt-opensource-linux-x64-5.15.2.run输出应该是ELF 64-bit LSB executable, x86-64。如果是ARM aarch64,说明下错包了。
6.2 Qt Creator启动黑屏或闪退
麒麟V10上Qt Creator启动黑屏,多半是OpenGL渲染问题。可以尝试用软件渲染启动:
QT_QUICK_BACKEND=software qtcreator或者在qtcreator.sh里加export LIBGL_ALWAYS_SOFTWARE=1。如果还是不行,检查是不是缺libxcb-xinerama之类的XCB扩展库。
6.3 编译大型项目时内存不足
Qt项目编译时,make -j开太多线程可能导致内存耗尽,特别是麒麟V10虚拟机内存给得不多的情况。表现是编译器被OOM Killer杀掉,报internal compiler error: Killed。
解决办法:根据内存大小调整并行数。4GB内存用make -j2,8GB用-j4,16GB以上可以-j8。别盲目-j$(nproc)。
6.4 关于系统源Qt的清理建议
如果你之前用系统源装过Qt,/usr/bin/qmake可能指向系统版本。即使你配了PATH,某些构建脚本可能硬编码了/usr/bin/qmake。彻底的做法是:
sudo mv /usr/bin/qmake /usr/bin/qmake.bak然后确保/opt/Qt5.15.2/5.15.2/gcc_64/bin在PATH最前面。这样任何地方调qmake都是你装的版本。
6.5 一个实用的环境检查脚本
我写了个小脚本,每次在新机器上部署完Qt后跑一下,快速确认环境是否正常:
#!/bin/bash echo "=== qmake ===" qmake -v echo "=== Qt libs ===" ls $QTDIR/lib/libQt5Core.so.5 echo "=== plugins ===" ls $QTDIR/plugins/platforms/libqxcb.so echo "=== GL ===" ls /usr/lib64/libGL.so echo "=== fonts ===" fc-list :lang=zh | head -3 echo "=== compiler ===" g++ --version | head -1这几项都正常,基本就不会有大的编译问题了。哪一项缺失,针对性补装即可。
6.6 关于Qt 5.14与5.15.2的选择
热词里有人问Qt 5.14的离线包,这里说一下:5.14系列不是LTS,官方支持周期短,bug修复不如5.15.2完整。如果你没有特殊原因必须用5.14,直接上5.15.2。两者API差异极小,迁移成本几乎为零,但5.15.2的稳定性和社区资料明显更好。
6.7 麒麟V10上Qt与数据库、串口等外设的配合
Qt的QSerialPort在麒麟V10上使用时,要注意串口设备的权限。普通用户默认可能没有/dev/ttyS0的读写权限,需要把用户加入dialout组:
sudo usermod -aG dialout $USER重新登录后生效。数据库方面,Qt的QSqlDatabase如果连MySQL或PostgreSQL,需要对应的驱动插件。检查$QTDIR/plugins/sqldrivers/下是否有libqsqlmysql.so。没有的话,需要自行编译驱动,这个稍微复杂,建议优先用SQLite,Qt自带驱动,开箱即用。
7. 写在最后的一些个人体会
在麒麟V10上搞Qt开发,最耗时间的从来不是安装本身,而是各种“意料之外”的编译错误。我的经验是:环境搭建阶段多花半小时把依赖装全、把版本理清,后面能省下几十小时的排查时间。很多人急着装完就写代码,结果被各种缺库、版本冲突折腾得怀疑人生。
另外,麒麟V10不同小版本之间也有差异,桌面版和服务器版的包管理、默认库版本都不完全一样。如果你在A机器上装好了,换到B机器上最好重新走一遍检查流程,不要直接拷贝/opt/Qt5.15.2目录了事——库的软链接和系统依赖可能对不上。
最后分享一个习惯:每次部署完,把qmake -v、g++ --version、ldd关键库的结果记在一个文本文件里,放在项目根目录。下次换机器或者同事问环境配置,直接发这个文件,比口头描述准确得多。这个习惯帮我省了无数次“你那边什么版本”的来回扯皮。