Qt应用依赖多版本glibc的原因及版本精简方案咨询
Qt Linux应用多版本GLIBC/GLIBC++依赖问题排查与解决
问题描述
用Qt开发的应用在Linux环境下依赖大量不同版本的glibc和glibc++,Windows环境无此问题。希望减少依赖版本数量或实现自动处理,若能仅依赖单一GLIBC版本,即可使用linuxdeployqt工具。
问题发现过程
运行CQtDeployer生成的DistributionKit中的AppName.sh脚本时,出现如下报错:
username@username:~/Downloads/DistributionKit$ ./AppName.sh /home/username/Downloads/DistributionKit/bin/AppName: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by /home/username/Downloads/DistributionKit/bin/AppName) /home/username/Downloads/DistributionKit/bin/AppName: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /home/username/Downloads/DistributionKit/bin/AppName) /home/username/Downloads/DistributionKit/bin/AppName: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.32' not found (required by /home/username/Downloads/DistributionKit/bin/AppName) /home/username/Downloads/DistributionKit/bin/AppName: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /home/username/Downloads/DistributionKit/lib/libQt5Widgets.so.5) /home/username/Downloads/DistributionKit/bin/AppName: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.38' not found (required by /home/username/Downloads/DistributionKit/lib/libQt5Gui.so.5) /home/username/Downloads/DistributionKit/bin/AppName: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.38' not found (required by /home/username/Downloads/DistributionKit/lib/libQt5Network.so.5) /home/username/Downloads/DistributionKit/bin/AppName: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by /home/username/Downloads/DistributionKit/lib/libQt5Network.so.5) /home/username/Downloads/DistributionKit/bin/AppName: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /home/username/Downloads/DistributionKit/lib/libQt5Network.so.5) /home/username/Downloads/DistributionKit/bin/AppName: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.35' not found (required by /home/username/Downloads/DistributionKit/lib/libQt5Core.so.5) /home/username/Downloads/DistributionKit/bin/AppName: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.32' not found (required by /home/username/Downloads/DistributionKit/lib/libQt5Core.so.5) /home/username/Downloads/DistributionKit/bin/AppName: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by /home/username/Downloads/DistributionKit/lib/libQt5Core.so.5) /home/username/Downloads/DistributionKit/bin/AppName: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.33' not found (required by /home/username/Downloads/DistributionKit/lib/libQt5Core.so.5) /home/username/Downloads/DistributionKit/bin/AppName: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by /home/username/Downloads/DistributionKit/lib/libQt5Core.so.5) /home/username/Downloads/DistributionKit/bin/AppName: /lib/x86_64-linux-gnu/libstdc++.so.6: version `CXXABI_1.3.13' not found (required by /home/username/Downloads/DistributionKit/lib/libQt5Core.so.5) /home/username/Downloads/DistributionKit/bin/AppName: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.38' not found (required by /home/username/Downloads/DistributionKit/lib/libicui18n.so.74) /home/username/Downloads/DistributionKit/bin/AppName: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.38' not found (required by /home/username/Downloads/DistributionKit/lib/libicui18n.so.74) /home/username/Downloads/DistributionKit/bin/AppName: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.38' not found (required by /home/username/Downloads/DistributionKit/lib/libicuuc.so.74) /home/username/Downloads/DistributionKit/bin/AppName: /lib/x86_64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.30' not found (required by /home/username/Downloads/DistributionKit/lib/libicuuc.so.74) /home/username/Downloads/DistributionKit/bin/AppName: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.38' not found (required by /home/username/Downloads/DistributionKit/lib/libicuuc.so.74) /home/username/Downloads/DistributionKit/bin/AppName: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.33' not found (required by /home/username/Downloads/DistributionKit/lib/libicuuc.so.74) /home/username/Downloads/DistributionKit/bin/AppName: /lib/x86_64-linux-gnu/libc.so.6: version `GLIBC_2.34' not found (required by /home/username/Downloads/DistributionKit/lib/libicuuc.so.74)
补充说明
生成DistributionKit的环境为Kubuntu 24.04,出现报错的测试环境为Ubuntu 20.04。
问题原因
- 发行版库版本差异:Kubuntu 24.04搭载的GLIBC版本为2.38,对应GLIBC版本也更高;而Ubuntu 20.04的GLIBC仅为2.31,GLIBCXX最高支持到3.4.28。编译环境的库版本远高于目标系统,导致编译生成的二进制文件依赖高版本GLIBC/GLIBC符号。
- Qt库与系统库绑定:使用Kubuntu 24.04自带的Qt库或在该环境编译Qt时,会默认链接系统高版本的GLIBC/GLIBC++,这些Qt库本身就依赖高版本符号,打包后在低版本系统运行必然报错。
- 高版本ICU库影响:报错中出现的
libicui18n.so.74、libicuuc.so.74是高版本ICU库,它们同样依赖高版本GLIBC,进一步增加了版本依赖的复杂度。
解决方法
1. 基于低版本发行版编译(最稳妥)
- 直接在Ubuntu 20.04或更老的发行版(如Ubuntu 18.04)上搭建Qt编译环境,完成应用编译与打包。编译出的二进制文件会默认依赖编译系统的低版本GLIBC,自然兼容同版本及更高版本的Linux系统。
- 若不想更换本地系统,可通过Docker拉取Ubuntu 20.04镜像,在容器内搭建环境完成编译打包,避免本地环境污染。
2. 编译时指定兼容低版本GLIBC
- 添加编译选项:给GCC传递
-static-libgcc -static-libstdc++参数,静态链接GLIBC++的核心库,减少动态依赖;同时可通过--sysroot指定Ubuntu 20.04的系统根文件系统(包含对应版本的头文件和库),强制编译器生成兼容低版本的代码。 - 注意:该方法对复杂应用可能存在兼容性风险,需充分测试。
3. 替换打包工具并打包依赖库
- 若能切换到低版本系统编译,直接使用linuxdeployqt打包,它会自动收集Qt库及必要的系统依赖,确保打包后的应用可在目标系统运行。
- 若需保留当前编译环境,可手动将高版本的GLIBC/GLIBC++库复制到DistributionKit的
lib目录,修改AppName.sh脚本,添加export LD_LIBRARY_PATH=$DIR/lib:$LD_LIBRARY_PATH,让程序优先加载打包的库而非系统库。
4. 静态编译Qt与应用(彻底解决依赖)
- 编译Qt时添加
-static参数进行静态编译,将Qt库静态链接进应用,大幅减少动态依赖。但需注意:GLIBC本身不建议全静态链接(可能导致部分系统调用兼容性问题),可仅静态链接GLIBC++和Qt库,动态链接基础版本的GLIBC。静态编译需额外处理Qt插件的集成配置,需参考Qt官方文档调整编译参数。
内容的提问来源于stack exchange,提问作者Lsddesu Ldesu
相关产品推荐
相关产品推荐

