You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。


问题原因

  1. 发行版库版本差异:Kubuntu 24.04搭载的GLIBC版本为2.38,对应GLIBC版本也更高;而Ubuntu 20.04的GLIBC仅为2.31,GLIBCXX最高支持到3.4.28。编译环境的库版本远高于目标系统,导致编译生成的二进制文件依赖高版本GLIBC/GLIBC符号。
  2. Qt库与系统库绑定:使用Kubuntu 24.04自带的Qt库或在该环境编译Qt时,会默认链接系统高版本的GLIBC/GLIBC++,这些Qt库本身就依赖高版本符号,打包后在低版本系统运行必然报错。
  3. 高版本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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 06:24:54