一、前言
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源码
wget https://ftp.gnu.org/gnu/gcc/gcc-9.5.0/gcc-9.5.0.tar.gz
2. 自动下载gcc必备依赖(关键:gmp/mpfr/mpc/isl)
解压源码后,执行官方脚本自动拉取依赖,无需手动一个个下载
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
# 仅清空gcc编译会检测的库路径,保留conda和系统PATH不变
unset LIBRARY_PATH
unset CPATH
unset C_INCLUDE_PATH
unset CPLUS_INCLUDE_PATH
1. 进入源码目录,清理旧编译缓存
cd ~
# 删除之前失败的编译目录,彻底重来
rm -rf gcc-9.5.0/build_gcc9
cd gcc-9.5.0
# 新建独立编译目录(源码和编译文件分离,最佳实践)
mkdir build_gcc9
cd build_gcc9
2. configure配置(无sudo专属参数,直接复制)
../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后台运行)
# 利用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. 临时生效(当前终端)
# 将本地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. 永久生效(新开终端无需重复输入)
echo 'export PATH=$HOME/software/gcc9/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=$HOME/software/gcc9/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

被折叠的 条评论
为什么被折叠?



