麒麟 V10 (Lance) x86_64 GCC‑9.4.0 编译部署完整总结
目标:系统自带 libstdc++ 最高只有
GLIBCXX_3.4.24,需要拿到GLIBCXX_3.4.25;不替换系统库,独立部署 gcc‑9.4.0,产出 GLIBCXX_3.4.28 向下兼容全部低版本符号 操作系统:Kylin Linux Advanced Server V10 (Lance) 4.19.90‑52.33.v2207.ky10.x86_64
核心原则
- ❌严禁覆盖 / 替换系统
/usr/lib64/libstdc++.so.6,否则 ssh、yum、ls 会直接崩溃。 - ✅GCC9.4 安装到独立目录
/usr/local/gcc94,业务程序通过LD_LIBRARY_PATH加载新库。 - ✅
--without‑isl关闭 isl 循环优化,规避 isl 下载、版本兼容问题,不影响 libstdc++ 产物。
完整操作步骤
1. 准备源码与依赖包
1)上传 gcc‑9.4.0.tar.xz 解压到 /usr/local/src/
cd /usr/local/src
tar -Jxf gcc-9.4.0.tar.xz
cd gcc-9.4.02)外网下载 3 个依赖包,上传到 gcc‑9.4.0 源码根目录,不解压
- gmp‑6.2.1.tar.bz2
- mpfr‑4.1.0.tar.bz2
- mpc‑1.2.1.tar.gz
3)手动解压并创建软链接(不执行 download_prerequisites 脚本,避免 ftp 网络卡死)
tar -jxf gmp-6.2.1.tar.bz2
tar -jxf mpfr-4.1.0.tar.bz2
tar -zxf mpc-1.2.1.tar.gz
ln -sf gmp-6.2.1 gmp
ln -sf mpfr-4.1.0 mpfr
ln -sf mpc-1.2.1 mpc2. configure 配置
mkdir build && cd build
rm -rf *
../configure \
--prefix=/usr/local/gcc94 \
--enable-languages=c,c++ \
--disable-multilib \
--without-isl生产实践:大量离线编译 gcc‑9.x 场景,都会加
--without‑isl,规避 isl 下载、版本兼容问题,产出的 C++ 标准库不受任何影响。 出现config.status: creating Makefile代表配置成功;语言、文档相关警告直接忽略。
3. 编译 & 安装
⚠️麒麟 V10 编译 gcc 非常耗内存,不要用
‑j$(nproc),使用‑j2,内存不足改为‑j1;建议使用 screen 防止 SSH 超时断开。 ⚠️编译时间很长,8 核机器大约 2‑4 小时,不要中断会话;如果是 ssh 远程登录,建议用 screen/tmux 防止断开导致编译终止。
make -j2
make install4. 校验产物
strings /usr/local/gcc94/lib64/libstdc++.so.6 | grep GLIBCXX确认输出包含:GLIBCXX_3.4.25 ~ GLIBCXX_3.4.28。
5. 业务程序使用新 libstdc++
方式 A:临时 shell 会话
export LD_LIBRARY_PATH=/usr/local/gcc94/lib64:$LD_LIBRARY_PATH
./你的程序
ldd ./你的程序方式 B:生产 systemd 服务(推荐)
service 文件[Service]段添加环境变量:
[Service]
Environment="LD_LIBRARY_PATH=/usr/local/gcc94/lib64:$LD_LIBRARY_PATH"systemctl daemon-reload
systemctl restart 服务名注意:shell 中 export 环境变量对 systemd 托管的服务无效,必须写进 unit 文件。
6. 离线迁移(其他同架构麒麟 V10 服务器复用)
tar -zcvf gcc94.tar.gz -C /usr/local gcc94目标机器解压到/usr/local,直接使用,无需重新编译。
7. 可选清理源码释放磁盘
rm -rf /usr/local/src/gcc-9.4.0常见踩坑清单
./contrib/download_prerequisites卡住:ftp 网络问题,放弃脚本,手动解压 + 软链接。- OOM 编译被杀死:降低 make 并发
‑j1,使用 screen 跑编译。 - 程序依然报
GLIBCXX_3.4.25 not found:- systemd 服务没有配置 LD_LIBRARY_PATH;
- ldd 确认程序加载的仍然是系统
/usr/lib64/libstdc++.so.6。
- 不要做全局 ld.so.conf 配置,容易导致系统老工具异常。
版本对照
- GCC‑7:GLIBCXX_3.4.24(系统自带)
- GCC‑8:GLIBCXX_3.4.25
- GCC‑9.4.0:GLIBCXX_3.4.28,包含全部低版本符号,满足本次需求。