libstdc++.so.6 version `GLIBCXX_3.4.29‘ not found
·
一、最近调试一个项目的时候遇见这个glibc++的库文件的版本的问题
root@localhost:~/test/build# ./program
./program: /usr/lib/aarch64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.29' not found (required by ./test/build/libs/libtest.so)
./program: /usr/lib/aarch64-linux-gnu/libstdc++.so.6: version `GLIBCXX_3.4.26' not found (required by ./test/build/libs/libtest.so)
二、然后查看我的系统版本信息如下:
root@localhost:~# cat /etc/os-release
NAME="Ubuntu"
VERSION="18.04.5 LTS (Bionic Beaver)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 18.04.5 LTS"
VERSION_ID="18.04"
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
VERSION_CODENAME=bionic
UBUNTU_CODENAME=bionic
root@localhost:~#
三、网上查了一下资料
在 Ubuntu 18.04 中,libstdc++ 提供的 GLIBCXX_ 版本符号默认最高支持到 GLIBCXX_3.4.25。
Ubuntu 18.04 官方默认的 GLIBCXX 版本支持至 GLIBCXX_3.4.25 。如需更高版本,必须手动升级 GCC/libstdc++。
四、所以这里最简单的方法就是将我们的系统的GLIBCXX进行升级即可
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt update
sudo apt install gcc-9 g++-9 libstdc++-9-dev
这样就可以解决我们的链接找不到对应版本的库文件支持的问题。
五、然后我们可以系统地了解一下gcc和g++
GCC和G++之所以如此重要,主要源于它们在软件开发生态中扮演的基石角色和独特的综合优势:
1. 开源世界的“编译器标准”
- 完全免费且开源:自1987年诞生以来,GCC始终是自由软件运动的旗舰项目。任何人都能无成本使用、研究其源码甚至定制修改,这使其成为Linux、GNU工具链和无数开源项目的默认选择。
- Linux内核的御用编译器:Linux内核自1992年起依赖GCC编译,直到今天仍是官方推荐工具。这奠定了它在开源社区的不可替代地位。
2. 无与伦比的跨平台能力
- 支持“从超级计算机到嵌入式芯片”:覆盖x86、ARM、RISC-V、MIPS、PowerPC等几十种架构,几乎能编译任何硬件平台的代码。
- 操作系统通吃:Linux、Windows(MinGW/Cygwin)、macOS、BSD、Solaris等全平台可用,真正做到“一次编写,处处编译”。
3. 语言支持和标准跟进
- 不仅是C/C++:GCC是集合(Compiler Collection),还支持Fortran、Ada、Go、Objective-C、D等多种语言。
- 标准同步更新:对C++20/23、C23等新标准支持非常及时,提供严格的-std=选项,是测试代码标准兼容性的权威工具。
4. 极致的优化与性能
- 强大的优化套件:-O2、-O3、-Ofast等级别优化,针对特定CPU的-march=native,以及链接时优化(LTO),生成的代码在性能上足以媲美商业编译器(如ICC)。
- 控制力精细:允许开发者通过数百个选项微调编译行为,从警告级别到机器指令,适合底层开发和高性能计算场景。
5. 生态系统的基石
- 默认教学工具:全球绝大多数高校的C/C++课程以GCC/G++为教学环境,培养了一代又一代开发者。
- CI/CD流水线标配:GitHub Actions、GitLab CI等主流持续集成环境都预装GCC,是自动化构建的默认选项。
- 包管理器的依赖:Debian、Red Hat等Linux发行版的软件包编译几乎全部采用GCC,确保了生态一致性。
6. 完整的工具链集成
不止于编译:
- GDB调试:与GNU Debugger无缝配合
- Binutils:汇编(as)、链接(ld)、符号分析(nm)等工具链完备
- Glibc深度整合:与GNU C Library协同优化,形成从编译到运行的完整闭环
总结
GCC/G++的重要性不在于某个单一特性,而在于它用30多年的时间,构建了一个开放、稳定、高性能、跨平台的编译基础设施。它既是开源精神的实物象征,也是现代数字世界(从云端服务器到物联网设备)的“沉默的编译者”。对于开发者而言,掌握GCC/G++不仅是使用一个工具,更是理解软件如何从源代码变为机器指令的必经之路。
六、如果升级的话,需要注意以下要点:
- 不要直接替换系统默认 libstdc++.so.6:强制替换可能导致系统依赖崩溃,应通过安装新 GCC 来安全升级
- 版本对应关系:
- GCC 7 → GLIBCXX_3.4.25(Ubuntu 18.04 默认)
- GCC 8 → GLIBCXX_3.4.26
- GCC 9 → GLIBCXX_3.4.28
- PPA 安全性:ubuntu-toolchain-r/test 是 Ubuntu 官方维护的测试 PPA,相对稳定可靠
- 遗留系统警告:Ubuntu 18.04 已于 2023 年 4 月停止标准支持,建议迁移至 20.04 LTS 或更高版本以获得长期安全更新
- 查找库的原则是先找程序指定的链接库,找不到的情况下才会去找系统库。
总结
在Ubuntu 18.04系统中运行程序时出现GLIBCXX_3.4.29和GLIBCXX_3.4.26版本缺失错误,原因是该系统默认最高仅支持GLIBCXX_3.4.25。解决方案是通过添加PPA源并安装gcc-9/g++-9来升级GCC和libstdc++。同时需要了解GCC/G++的重要性:作为开源世界的标准编译器,具有跨平台能力强、语言支持广泛、性能优化出色等特点,是软件生态的基石工具。升级时需注意不要直接替换系统库,应通过安装新版GCC来安全升级,建议考虑将系统迁移至更新的LTS版本以获得更好的支持。
更多推荐
所有评论(0)