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
相关推荐
新时代牛马12 分钟前
Linux 性能调优与追踪完整篇:ftrace、perf、eBPF从采样到落地验证
linux·运维·服务器
捷瑞电子工坊14 分钟前
Ubuntu 下安装 VSCode 和 gcc 的简单步骤
vscode·ubuntu·代码编辑器·安装教程·gcc·deb·snap
sunoo-22920 分钟前
【网络编程 + 数据库】select 与 epoll 核心区别详解 + SQLite 入门到 C 接口全攻略
linux·网络·数据库·vscode·学习·sqlite
zbyyd25 分钟前
Linux 系统编程 :select/epoll 多路复用与 SQLite 数据库实战
linux·数据库·sqlite
Mortalbreeze34 分钟前
深入理解 Linux IO 模型(二):多路复用——select
linux·运维·服务器·网络·tcp/ip
Mrs_DongDong43 分钟前
华为云 Windows 服务器远程桌面自定义端口排障指南
服务器·windows·华为云
koi77u1 小时前
嵌入式学习———sqlite数据表
linux·数据库·学习·sqlite
SamChan901 小时前
PDF翻译服务端到端基准测试:4款主流方案的吞吐量、延迟、内存占用对比
服务器·网络·python·ai·pdf·wpf
笑梦无境1 小时前
nginx安装(5)
linux·运维·nginx
xx~t1 小时前
嵌入式——Linux软件编程——数据库
linux·c语言·数据库·oracle·sqlite