《5年Qt老鸟的实战笔记:在麒麟V10与统信UOS上,我踩过的那些坑》
前言去年从上一家公司离职后我休息了一段时间最近打算以远程顾问或技术合伙人的身份继续深耕信创领域的Qt国产化适配工作。回想这5年从x86到飞腾/龙芯从Ubuntu到麒麟V10、可以说把国产化道路上的“地雷”都踩了个遍。国产化适配到底难在哪其实不在于Qt语法本身而在于环境、依赖、底层图形栈和硬件的兼容性。今天我就把印象最深的5个典型问题记录下来既是给自己做个复盘也希望能帮到正在这条路上挣扎的同行。坑一打包发布后的“xcb”平台插件噩梦问题现象在麒麟系统上开发完Qt程序一切正常。但打包发给甲方测试双击运行直接报错qt.qpa.plugin: Could not load the Qt platform plugin xcb当时就懵了明明在开发机上跑得好好的。问题根源说白了就是目标机器上缺少Qt程序依赖的底层图形库X11/XCB相关。我们的开发机装了完整Qt SDK库是齐全的但甲方客户的纯运行环境往往很“干净”。解决方案1. 暴力但有效的办法把Qt安装目录下的 plugins/platforms/ 整个文件夹拷贝到你程序的发布目录里确保 链接forms 子目录下。2. 根治的办法编写启动脚本在运行程序前 export LD_LIBRARY_PATH把程序自带的库路径加上。再配合 ldd 命令检查依赖把缺失的 .so 文件一个个补全。3. 偷懒的大招用 linuxdeployqt 工具自动抽取依赖省心省力。坑二从x86向ARM架构飞腾/鲲鹏迁移编译都过不去问题现象项目要求把一套成熟的Qt显控软件从x86平台移植到飞腾2000麒麟V10的全国产化环境中。本来以为Qt是跨平台的结果源码拷过去编译各种报错要么找不到头文件要么链接时库版本对不上。问题根源1. 交叉编译工具链版本不匹配。ARM平台的gcc和x86平台的不是一回事。2. 第三方依赖库没有ARM版本。比如有些自编译的 .so 文件在x86下能用到了ARM下直接报错。3. 代码里有些假设是x86字节序或对齐方式的写法在ARM上会崩溃。解决方案1. 确认工具链飞腾平台用 gcc-arm-8.3-2019.03 这个版本比较稳。2. 源码重编所有第三方依赖库不要偷懒拷二进制一定要在ARM机器上从源码重新 ./configure make 一遍。3. 代码规范涉及到内存操作比如 memcpy、结构体指针强转的地方注意字节对齐问题加上 #pragma# pack 或者在QT中用 QDataStream 规范序列化。坑三Release版本下崩溃连个屁都查不到问题现象程序在研发部跑得好好的发到客户现场跑了几天偶尔崩溃一次。关键是客户机器上没有开发环境给回来的只有一行“段错误”的提示没有行号没法定位。问题根源Release模式默认不带调试符号而且为了性能优化代码执行顺序可能都被打乱了。用常规的 printf 大法根本抓不住这种偶发崩溃。解决方案1. 确保生成Core Dump文件在国产麒麟系统上默认的coredump路径可能在 /var/core 或 /tmp 下。用 ulimit -c unlimited 放开限制。2. 保留符号表编译Release版本的时候加 -g 选项生成调试信息但用 strip 命令剥离出来单独保存。这样既不影响程序运行效率等崩溃发生时又能用 gdb 加载符号表去分析core文件。3. 调试命令拿到core文件后gdb ./YourApp core然后输入 btbacktrace就能看到崩溃时的函数调用堆栈哪怕看不到行号也能锁定是哪个模块的哪类操作出了问题。坑四界面花屏怀疑人生问题现象在统信UOS上Qt界面某些时候会花屏、闪烁或者QML界面里的控件直接消失不见。重启程序有时能好有时不行。坑五中文输入法无法调用问题现象Qt程序里的 QLineEdit 和 QTextEdit 控件死活调不出系统的中文输入法搜狗、麒麟自带的都试过只能打英文。上面这些内容只是我这5年工作里很小的一部分。从去年离职到现在我也在思考接下来的方向。目前不想再去坐班了希望以远程技术顾问或按次计费的救火队员身份继续为有需要的团队服务。如果你正在做国产化麒麟、统信UOS、飞腾、龙芯相关的Qt项目遇到了编译通不过、跑起来崩溃、界面不显示等疑难杂症欢迎私信我。我这边可以提供按小时远程排查或按问题打包解决的服务。PS另外2个问题我整理成了一份《麒麟/UOS下Qt常见报错速查手册》PDF里面包含详细的排查命令和脚本。需要的朋友评论区留邮箱我发给你。

相关新闻

最新新闻

日新闻

周新闻

月新闻