Linux——普通用户离线源码编译 gcc-9 方法和调用教程

一、前言

1. 场景痛点

  • 服务器无管理员sudo权限,无法apt/yum安装gcc-9

  • 服务器无外网,不能用conda在线安装gcc,只能纯离线编译

  • CUDA11.1 仅支持最高gcc10,系统默认gcc版本过高,编译DCNv2等cuda算子报错:unsupported GNU version! gcc versions later than 10 are not supported!

2. 环境信息

环境 版本
系统 Linux x86_64
CUDA 11.1
目标编译器 gcc-9.5.0(稳定版)
权限 普通用户,无root
网络 服务器内网离线,无外网

3. 最终效果

将gcc9安装至个人用户目录,不改动系统任何文件,多gcc版本共存;后续可直接用于CUDA11.1算子编译,彻底规避nvcc编译器版本不兼容问题。


二、前期准备(有网机器提前下载,上传服务器)

服务器无网络,需要提前在自己电脑下载完整源码+依赖,打包上传至服务器家目录 ~/

1. 下载gcc9.5.0源码

bash 复制代码
wget https://ftp.gnu.org/gnu/gcc/gcc-9.5.0/gcc-9.5.0.tar.gz

2. 自动下载gcc必备依赖(关键:gmp/mpfr/mpc/isl)

解压源码后,执行官方脚本自动拉取依赖,无需手动一个个下载

bash 复制代码
tar -zxvf gcc-9.5.0.tar.gz
cd gcc-9.5.0
# 自动下载并解压4个编译依赖,离线编译必备
./contrib/download_prerequisites

执行完毕后,目录下会出现4个依赖压缩包,不要删除、不要移动 ,直接把整个 gcc-9.5.0 文件夹上传到服务器。


三、服务器端离线编译(全程无sudo,复刻实操流程)

避坑前置:清空污染环境变量(解决90%编译报错)

conda、之前自定义库路径会给 LIBRARY_PATH 注入当前目录 .,gcc编译脚本严格禁止该符号,会直接报错终止编译。

⚠️ 只清空危险变量,不重置系统PATH,不破坏conda

bash 复制代码
# 仅清空gcc编译会检测的库路径,保留conda和系统PATH不变
unset LIBRARY_PATH
unset CPATH
unset C_INCLUDE_PATH
unset CPLUS_INCLUDE_PATH

1. 进入源码目录,清理旧编译缓存

bash 复制代码
cd ~
# 删除之前失败的编译目录,彻底重来
rm -rf gcc-9.5.0/build_gcc9
cd gcc-9.5.0
# 新建独立编译目录(源码和编译文件分离,最佳实践)
mkdir build_gcc9
cd build_gcc9

2. configure配置(无sudo专属参数,直接复制)

bash 复制代码
../configure \
--prefix=$HOME/software/gcc9 \
--enable-languages=c,c++ \
--disable-multilib

参数解释:

  • --prefix=$HOME/software/gcc9:安装到个人家目录,无需任何管理员权限

  • --enable-languages=c,c++:只编译C/C++,减少编译时间,无需多余语言

  • --disable-multilib:仅编译64位程序,适配服务器环境,避免32位兼容报错

3. 编译&安装(耗时较长,建议screen后台运行)

bash 复制代码
# 利用16个CPU核心编译。注意考虑自己设备的cpu核心数
make -j16
# 无sudo直接安装到个人目录,无需管理员权限
make install

编译时长参考:16核服务器约20~30分钟,耐心等待,看到如下日志即为安装成功:

make[1]: Leaving directory '/home/XXX/gcc-9.5.0/build_gcc9'

注意事项:不要中断,第一次运行就得编译完,否则就需要从头(第一步)来一遍。


四、加载本地gcc9,切换编译器版本

1. 临时生效(当前终端)

bash 复制代码
# 将本地gcc9路径放到环境变量最前面,优先调用
export PATH=$HOME/software/gcc9/bin:$PATH
# 动态库链接路径,解决后续编译找不到库文件问题
export LD_LIBRARY_PATH=$HOME/software/gcc9/lib64:$LD_LIBRARY_PATH

# 校验版本,输出gcc version 9.5.0 即为成功
gcc -v
g++ -v

2. 永久生效(新开终端无需重复输入)

bash 复制代码
echo 'export PATH=$HOME/software/gcc9/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=$HOME/software/gcc9/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc
相关推荐
ltl8 小时前
存储性能建模:IOPS、吞吐与延迟
linux
波波0078 小时前
C# 15 重磅新特性: 带标签 break 与 continue:重新定义嵌套循环控制流
服务器·前端·c#
刘某的Cloud9 小时前
ceph osd 导入导出 rbd volume 卷
linux·运维·ceph·volume
隔窗听雨眠11 小时前
GBase 8s并发控制深度解析:封锁机制、隔离级别与死锁处理全攻略
服务器·数据库·oracle
酸菜。11 小时前
dw_axi_dmac总结
linux
神奇霸王龙12 小时前
Agent 准入门控屠夫:5 旗舰 4 维度评估
linux·运维·数据库·ai·ai作画·agent·ai编程
鲸采云SRM采购管理系统12 小时前
采购管理系统哪家好?2026最新测评对比
java·服务器·数据库
那年窗外下的雪.12 小时前
AIDC 学习日志 第 04 天 BGP Underlay 基础与路由选择
服务器·学习·php
0x5313 小时前
Java网络编程(二)
java·服务器·网络
果果燕13 小时前
C++学习笔记(三):类与对象拓展学习笔记
java·服务器·前端