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
相关推荐
鬼手点金4 小时前
nanoGPT/nanochat 能做出 DeepSeek/Qwen 这样的大模型吗?
服务器·前端·javascript·bug·openclaw
贵州诚鑫致达科技有限公司5 小时前
Linux的yum源怎么重启?源不是服务
linux·运维·服务器
遇印记6 小时前
传输层,网络层
运维·服务器·网络·windows·学习
Elastic 中国社区官方博客7 小时前
一条 ES|QL 查询,涵盖365天的审计日志:在热数据和可搜索快照上执行相同的搜索
大数据·运维·服务器·elasticsearch·搜索引擎·全文检索
北京中科新远科技7 小时前
高速光模块上线验收实战:DOM、FEC、BER与端口计数器怎么一起看
服务器·网络·php
澜山奕秋8 小时前
RHCSA
linux·运维·服务器
pride.li8 小时前
第03章 Python 教程-基础语法:注释与变量
服务器·前端·后端·python·算法·计算机视觉
Web极客码9 小时前
告别流式截断:我用客户端中间件解决长文本 API 跨国 SSE 断连与数据自愈
linux·agent 图
cnnews9 小时前
Chromebox3安装Ubuntu后内存化与最小化 eMMC 写入优化
linux·运维·ubuntu
.Bryce.9 小时前
在智能体中使用A2A工具:让大模型自己决定“该找谁帮忙“
android·java·服务器·redis·后端·agent·a2a