gcc与g++的编译及配置

摘要: 在本文中,笔者回答了编程环境配置中的常见问题,即在无root权限情况下,在非系统路径中部署一个与系统默认版本不同的gcc或g++,然后只在我们自己使用时显式指定这个高级版本的库。


〓 Table of Contents 〓




背景

很多时候当我们希望在远程服务器上部署某个软件,或者安装某个代码库的时候,会发现服务器默认的gcc或者g++版本并不符合我们的期望,例如,当我希望在dsflab的服务器上安装pytorch3d时,以下是我面临的情况:

1
2
3
4
5
6
7
8
(base) bash-4.2$ gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/libexec/gcc/x86_64-redhat-linux/4.8.5/lto-wrapper
Target: x86_64-redhat-linux
Configured with: ../configure --prefix=/usr --mandir=/usr/share/man --infodir=/usr/share/info --with-bugurl=http://bugzilla.redhat.com/bugzilla --enable-bootstrap --enable-shared --enable-threads=posix --enable-checking=release --with-system-zlib --enable-__cxa_atexit --disable-libunwind-exceptions --enable-gnu-unique-object --enable-linker-build-id --with-linker-hash-style=gnu --enable-languages=c,c++,objc,obj-c++,java,fortran,ada,go,lto --enable-plugin --enable-initfini-array --disable-libgcj --with-isl=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/isl-install --with-cloog=/builddir/build/BUILD/gcc-4.8.5-20150702/obj-x86_64-redhat-linux/cloog-install --enable-gnu-indirect-function --with-tune=generic --with-arch_32=x86-64 --build=x86_64-redhat-linux
Thread model: posix
gcc version 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC)



这是由于我们的系统gcc版本并不符合安装pytorch3d的要求。那么在这种情况下,我们有3条路可以选:

  • 换一台服务器(一劳永逸)
  • 安装低版本pytorch3d(目标降级)
  • 更新gcc及g++版本(直面挑战)

当然我们肯定是选择第三条路,但要注意几点:

  • 不影响其他user的使用
  • 我们作为user没有root权限

则我们需要在无root权限情况下,在非系统路径中部署一个更高级版本的gcc或g++,然后只在我们自己使用时显式指定这个高级版本的库。




解决方案

〓 ReTURN 〓

因地制宜

首先,不要盲目地就开始跑去下载我们需要的gcc或者g++,一般来说,很多服务器会预先配置好很多个不同版本的gcc,g++,cuda等等,默认虽然是低版本的代码库,但是user可以根据自己的需要去指定某些高版本的库。因此很有可能, 我们需要的目标版本的gcc或g++在服务器上已经有了,只需要我们去显式地指定使用它们 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
(base) bash-4.2$ cd /usr/local/ # 一般多个版本的库都放在这个地方
(base) bash-4.2$ ls
bin cuda-10.0 cuda-10.1.105 cuda-11 cuda-11.0.207 cuda-11.4 cuda-11.5.0 cuda-11.7 cuda-11.8.0 cuda-8.0 cuda-8.0.61-1 cuda-9.1 cuda-9.2.148 etc include libexec packages software
cuda cuda-10.0.130 cuda-10.2 cuda-11.0 cuda-11.1 cuda-11.4.100 cuda-11.6 cuda-11.7.0 cuda-7.0 cuda-8.0.44 cuda-9.0 cuda-9.1.85 cuda-9.2.88 GNU lib man sbin src
cuda-10 cuda-10.1 cuda-10.2.89 cuda-11.0.182 cuda-11.1.74 cuda-11.5 cuda-11.6.2 cuda-11.8 cuda-7.5 cuda-8.0.61 cuda-9.0.176 cuda-9.2 dbpackages go lib64 nvidia share

(base) bash-4.2$ cd GNU

(base) bash-4.2$ ls
autoconf binutils emacs gcc-10.2.0 gcc-12.2.0 gcc6 gcc-7.2.0 gcc-8.3.0 gdbm-1.11 glpk gnutls libgcrypt m4 mpfr perl-5
autoconf-2.69 binutils-2.24 emacs-24.4 gcc-10.3.0 gcc4 gcc-6.1.0 gcc-7.3.0 gcc9 gettext glpk-4.65 gnutls-3.3.10 libgcrypt-1.7.6 m4-1.4.17 mpfr-3.1.2 perl-5.20.1
automake binutils-2.25.1 flex gcc11 gcc-4.9.2 gcc-6.2.0 gcc-7.5.0 gcc-9.1.0 gettext-0.19.5.1 gmp gperf libgpg-error make mpfr-3.1.5 perl-5.22.0
automake-1.13 binutils-2.28 flex-2.5.39 gcc-11.1.0 gcc5 gcc-6.3.0 gcc8 gcc-9.2.0 glibc gmp-6.0.0a gperf-3.1 libgpg-error-1.27 make-4.3 parallel readline
automake-1.13.4 clisp gcc10 gcc-11.2.0 gcc-5.3.0 gcc7 gcc-8.1.0 gcc-9.3.0 glibc-2.22 gnuplot gsl libsigsegv mpc parallel-20210722 readline-6
automake-1.15 clisp-2.49 gcc-10.1.0 gcc12 gcc-5.4.0 gcc-7.1.0 gcc-8.2.0 gdbm glibc-2.34 gnuplot-5.0.0 gsl-1.16 libsigsegv-2.10 mpc-1.0.2 perl5 readline-6.3

如我们所料,该文件下已经有各种高版本的gcc了,我们只需要在环境配置中显式指定他们就好。可以参考如下写法进行指定:

1
2
3
#GCC
export PATH=/usr/local/GNU/gcc-11.2.0/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/GNU/gcc-11.2.0/lib:$LD_LIBRARY_PATH

这样,当我们source环境配置后,再检查gcc以及g++版本

1
2
3
4
5
6
7
8
9
jlijz@bkzxcpu2a:/usr/local/GNU$ gcc -v
Using built-in specs.
COLLECT_GCC=/usr/local/bin/gcc11
COLLECT_LTO_WRAPPER=/usr/local/GNU/gcc-11.2.0/libexec/gcc/x86_64-pc-linux-gnu/11.2.0/lto-wrapper
Target: x86_64-pc-linux-gnu
Configured with: ../gcc-11.2.0/configure --prefix=/usr/local/GNU/gcc-11.2.0 --enable-clocale=generic --enable-host-shared --enable-shared
Thread model: posix
Supported LTO compression algorithms: zlib
gcc version 11.2.0 (GCC)



寻求外援

〓 ReTURN 〓

当本地确实不存在高版本的gcc,那么就必须寻求外援了。

下载

1
2
3
4
5
6
wget http://ftp.gnu.org/gnu/gcc/gcc-5.4.0/gcc-5.4.0.tar.gz
#5.4.0可以替换为你需要的版本号
tar –zxvf gcc-5.4.0.tar.gz
cd gcc-5.4.0
./contrib/download_prerequisites
#这一步是执行脚本自动下载安装所需的依赖

编译安装

1
2
3
4
5
6
7
cd gcc-5.4.0
mkdir objdir
cd objdir
../configure --disable-checking --enable-languages=c,c++ --disable-multilib --prefix=/home/username/gcc-5.4 --enable-threads=posix
#我这里使用的安装路径是/home/username/gcc-5.4,大家可以换成别的路径
make -j4 //执行makefile (过程漫长,可用多线程,但我没用)
make install

 注意事项 

--prefix=/home/username/gcc-5.4 这个选项的作用是指定GCC安装的目标目录。配置脚本会将编译好的GCC及其相关文件安装到这个目录中。这个路径不要填写 objdir 的绝对路径,而是填写你希望安装GCC的位置。

例如,假设你的用户名是xxx,你希望将编译好的GCC安装到你的主目录下,可以将 --prefix 设置为 /home/xxx/gcc-5.4。这样,当你运行 make install 时,GCC会被安装到这个指定的目录中。

 报错记录(1) 

相关博客

1
2
3
4
configure: error: 
*** LIBRARY_PATH shouldn't contain the current directory when
*** building gcc. Please change the environment variable
*** and run configure again.

LD_LIBRARY_PATH以冒号结尾,GCC不赞成该冒号。 还应确保C_INCLUDE_PATH不以冒号结尾,以避免出现相关问题。 方法如下:

方法一:

重新export LIBRARY_PATH和C_INCLUDE_PATH 尾部不含冒号

方法二:

1
2
export LIBRARY_PATH=$(echo $LIBRARY_PATH | sed 's/:$//; s/^://;')
export C_INCLUDE_PATH=$(echo $C_INCLUDE_PATH | sed 's/:$//; s/^://;')




环境配置

〓 ReTURN 〓

1
2
3
4
5
vim ~/.bashrc
export PATH=/home/username/gcc-5.4/bin:/home/username/gcc-5.4/lib64:$PATH
export LD_LIBRARY_PATH=/home/username/gcc-5.4/lib/:$LD_LIBRARY_PATH
#注意这里的path一定要和make的时候--prefix的path要对的上
source ~/.bashrc
作者

Jiawei Li

发布于

2024-06-05

更新于

2024-06-05

许可协议