前言
最近要用GPU服务器算东西,但服务器里GCC的版本是4.4.7,不支持C++11特性,为了不修改自己的程序,选择升级服务器的GCC版本。由于我只有普通账户,没有sudo权限,而且服务器不连接外网,只能通过winscp上传安装包,升级起来很麻烦,这两天查了很多资料,也遇到了许多问题,好在今天终于搞好了,故记录一下,以备日后查看。PS. 希望以后不要出问题。
准备工作
-
下载自己需要的GCC文件,上传到服务器中
我下载的是6.3.0版本,清华大学镜像网站 -
在服务器中解压GCC文件,进入解压目录查看编译所需依赖项并下载
tar zxvf gcc-6.3.0.tar.gz #解压命令 cat ./contrib/download_prerequisites #查看依赖项
依赖项下载地址:官方网站
下载并上传到服务器后依次解压这四个压缩文件,我实际编译gcc的过程中没有使用isl,但还是列了出来
tar jxvf gmp-4.3.2.tar.bz2 tar jxvf mpfr-2.4.2.tar.bz2 tar zxvf mpc-0.8.1.tar.gz tar jxvf isl-0.15.tar.bz2
-
安装依赖项
我最开始按照[2][3]里的方法安装依赖项,在GCC的make过程中会报错,显示没有以上三个依赖项,后来用[1]中的方法成功了,现在具体介绍。上述三个依赖项必须按照顺序gmp->mpfr->mpc的顺序依次安装,安装时注意指定安装路径,这三个依赖项执行安装命令时都在相应解压后的目录中进行:
./configure --prefix=/home/user/gcc/my-gmp-4.3.2/ && make && make install ./configure --prefix=/home/user/gcc/my-mpfr_2.4.2/ --with-gmp=/home/user/gcc/my-gmp-4.3.2/ && make && make install ./configure --prefix=/home/user/gcc/my-mpc_0.8.1/ --with-gmp=/home/user/gcc/my-gmp-4.3.2/ --with-mpfr=/home/user/gcc/my-mpfr_2.4.2/ && make && make install ./configure --prefix=/user/gcc/my-isl-0.15/ && make && make install
-
添加依赖项的环境变量
export LD_LIBRARY_PATH=:/home/user/gcc/my-mpc-0.8.1/lib:/home/user/gcc/my-gmp-4.3.2/lib:/home/user/gcc/my-mpfr-2.4.2/lib/:$LD_LIBRARY_PATH
安装GCC
-
生成makefile
进入gcc解压后的目录./configure --prefix=/home/user/gcc/my-gcc_6.3.0/ --enable-threads=posix --disable-checking --enable-language=c,c++ --disable-multilib --with-gmp=/home/user/gcc/my-gmp-4.3.2/ --with-mpfr=/home/user/gcc/my-mpfr_2.4.2/ --with-mpc=/home/user/gcc/my-mpc_0.8.1/
-
编译
make -j4 #在多核CPU上并行编译,提高编译速度
如果执行失败,直接使用make进行编译。我make -j4大概花了一个小时。
-
安装
make install
大概一个小时
-
修改用户环境变量
打开配置文件vi ~/.bashrc
在文档中添加
export PATH=/home/user/gcc/my-gcc-6.3.0/bin:/home/user/gcc/my-gcc-6.3.0/lib64:$PATH export LD_LIBRARY_PATH=/home/user/gcc/my-gcc-6.3.0/lib/:/home/user/gcc/my-gcc-6.3.0/lib64/:/home/user/gcc/my-mpc-0.8.1/lib:/home/user/gcc/my-gmp-4.3.2/lib:/home/user/gcc/my-mpfr-2.4.2/lib/:$LD_LIBRARY_PATH
保存后source一下
source ~/.bashrc
按照[1]中的说法
一定把新的gcc目录的bin、lib64放在$PATH的前面,这样调用gcc会优先找到我们的新的gcc,而不是系统目录的旧gcc
另外运行时库的环境变量LD_LIBRARY_PATH也一定要改,方式也是一定放在原先变量$LD_LIBRARY_PATH前面现在运行
gcc -v g++ -v which gcc which g++
应该可以看到新安装的GCC版本号,以及你的GCC安装路径了。
注意事项
-
因为我不是管理员,没有权限在系统目录下安装,所以上述所有软件的安装路径都在/home/user/目录下,安装时必须要指定安装路径,否则就会安装到默认的系统目录下而显示权限不足。
-
/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.21’ not found问题
这个问题网上的教程很多,我看了好些,还查了Google,解决方法很多,看的我眼花撩换的。
但是我刚安装好gcc时运行编译好的文件可以正常运行,后来再运行时才显示这个报错。所以我就在环境变量中把新版gcc目录中libstdc++.so.6所在路径加了进去,然后再运行程序时果然没报错了。这一项就是下图中的这一句:
使用ldd命令查看程序的所依赖的共享库列表ldd a.out
看到现在程序依赖的是新版的库文件了
linux-vdso.so.1 => (0x00007fff9d9ff000) libstdc++.so.6 => /home/user/gcc/my-gcc-6.3.0/lib64/libstdc++.so.6 (0x00002ab1ff6dd000) libm.so.6 => /lib64/libm.so.6 (0x00002ab1ffaa5000) libgcc_s.so.1 => /home/user/gcc/my-gcc-6.3.0/lib64/libgcc_s.so.1 (0x00002ab1ffd29000) libc.so.6 => /lib64/libc.so.6 (0x00002ab1fff3f000) /lib64/ld-linux-x86-64.so.2 (0x00002ab1ff4bb000)
可以使用如下命令查看系统GLIBC版本
strings /usr/lib64/libstdc++.so.6 | grep GLIBC
果然没有GLIBC_3.4.21版本,查看新安装GCC目录中GLIBC版本strings /home/user/gcc/my-gcc-6.3.0/lib64/libstdc++.so.6 | grep GLIBC
看到有GLIBC_3.4.21版本。
另外,博客[1]提供了在报错的情况下通过修改makefile来编译程序的方法。