由于公司有个项目在公安系统中,无法连接到外网,所以导致无法在网上直接安装一些软件,同时centos不自带gcc,导致了一系列的问题,这里就把解决的过程写下来。

    centos系统,我这里是6.5,其他版本类似,如果相差太大,估计就会不同。

1.安装低版本的GCC

    想要安装gcc5.4,电脑需要有一个较低版本的gcc,当然如果你是rpm直接支持gcc5.4,可以直接下载rpm里面对应gcc的文件,直接安装,我这里是centos对应的gcc版本低于gcc5.4的。

    先下载rpm文件:http://vault.centos.org/6.5/os/x86_64/Packages/,注意,路径中间有个6.5,就是centos 的版本,如果是其他版本可以直接改成对应的版本,如6.4,地址就是http://vault.centos.org/6.4/os/x86_64/Packages/,下载下面对应的rpm文件:

[root@localhost gcc-build]#rpm -ivh libstdc++-4.4.7-4.el6.x86_64.rpm
[root@localhost gcc-build]#rpm -ivh ppl-0.10.2-11.el6.x86_64.rpm 
[root@localhost gcc-build]#rpm -ivh cloog-ppl-0.15.7-1.2.el6.x86_64.rpm 
[root@localhost gcc-build]#rpm -ivh mpfr-2.4.1-6.el6.x86_64.rpm 
[root@localhost gcc-build]#rpm -ivh cpp-4.4.7-4.el6.x86_64.rpm 
[root@localhost gcc-build]#rpm -ivh kernel-headers-2.6.32-431.el6.x86_64.rpm 
[root@localhost gcc-build]#rpm -ivh glibc-headers-2.12-1.132.el6.x86_64.rpm 
[root@localhost gcc-build]#rpm -ivh glibc-devel-2.12-1.132.el6.x86_64.rpm 
[root@localhost gcc-build]#rpm -ivh gcc-4.4.7-4.el6.x86_64.rpm 
[root@localhost gcc-build]#rpm -ivh libstdc++-devel-4.4.7-4.el6.x86_64.rpm 
[root@localhost gcc-build]#rpm -ivh gcc-c++-4.4.7-4.el6.x86_64.rpm

如果遇到了error:Failed dependencies问题,可以加--nodeps --force,强制安装。

安装完后可以执行gcc -v,查看gcc的版本,这时候版本应该是gcc4.4.7

2.安装gcc5.4

    这里由于没有网我们需要下载gcc源码和对应的依赖:

gcc-5.4.0.tar.gz 安装包 
http://ftp.gnu.org/gnu/gcc/gcc-5.4.0/gcc-5.4.0.tar.gz

gmp-4.3.2.tar.bz2 gcc依赖包 
ftp://ftp.gnu.org/gnu/gmp/gmp-4.3.2.tar.bz2

mpfr-2.4.2.tar.bz2 gcc依赖包 
http://www.mpfr.org/mpfr-2.4.2/mpfr-2.4.2.tar.bz2

mpc-0.8.1.tar.gz gcc依赖包 
http://www.multiprecision.org/downloads/mpc-0.8.1.tar.gz

上面三个依赖的版本依据可以将gcc-5.4.0.tar.gz解压后在gcc-5.4.0/contrib/download_prerequisites文件里面看到如下:

# Necessary to build GCC.
MPFR=mpfr-2.4.2
GMP=gmp-4.3.2
MPC=mpc-0.8.1

然后就是安装,如果不是root用于,安装时注意加sudo。

安装gmp-4.3.2

[root@localhost gcc-build]#tar -xjvf gmp-4.3.2.tar.bz2
[root@localhost gcc-build]#cd gmp-4.3.2
[root@localhost gcc-build]#mkdir gmp-build
[root@localhost gcc-build]#cd gmp-build
#执行配置  --prefix表示后面将要安装到的目标位置,下面一样
[root@localhost gcc-build]#../configure --prefix=/usr/local/gmp-4.3.2
[root@localhost gcc-build]#make
[root@localhost gcc-build]#make install

安装mpfr-2.4.2 
安装mpfr依赖于gmp,所以应先安装gmp。

[root@localhost gcc-build]#tar -xjvf mpfr-2.4.2.tar.bz2
[root@localhost gcc-build]#cd mpfr-2.4.2
[root@localhost gcc-build]#mkdir mpfr-build
[root@localhost gcc-build]#cd mpfr-build
[root@localhost gcc-build]#../configure --prefix=/usr/local/mpfr-2.4.2 --with-gmp=/usr/local/gmp-4.3.2
[root@localhost gcc-build]#make
[root@localhost gcc-build]#make install

安装mpc-0.8.1.tar.gz

[root@localhost gcc-build]#tar -xzvf mpc-0.8.1.tar.gz
[root@localhost gcc-build]#cd mpc-0.8.1
[root@localhost gcc-build]#mkdir mpc-build
[root@localhost gcc-build]#cd mpc-build
[root@localhost gcc-build]#../configure --prefix=/usr/local/mpc-0.8.1 --with-gmp=/usr/local/gmp-4.3.2 --with-mpfr=/usr/local/mpfr-2.4.2
[root@localhost gcc-build]#make
[root@localhost gcc-build]#make install

添加环境变量

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/gmp-4.3.2/lib:/usr/local/mpc-0.8.1/lib:/usr/local/mpfr-2.4.2/lib

安装gcc-5.4.0

[root@localhost gcc-build]#tar -xzvf gcc-5.4.0.tar.gz
[root@localhost gcc-build]#cd gcc-5.4.0
[root@localhost gcc-build]#mkdir gcc-build
[root@localhost gcc-build]#cd gcc-build
[root@localhost gcc-build]#../configure --prefix=/usr/local/gcc-5.4.0 --enable-threads=posix --disable-checking --disable-multilib --enable-languages=c,c++ --with-gmp=/usr/local/gmp-4.3.2 --with-mpfr=/usr/local/mpfr-2.4.2 --with-mpc=/usr/local/mpc-0.8.1
[root@localhost gcc-build]#make
[root@localhost gcc-build]#make install

现在gcc-5.4.0安装完成了,但是gcc-5.4.0的环境变量还没有设置,系统中使用的还是旧版的gcc

重新设置gcc环境变量,更新系统gcc版本号

#备份gcc-4.4.7 
mkdir /usr/gcc447backup/
mv /usr/bin/{gcc,g++} /usr/gcc447backup
ln -s /usr/local/gcc-5.4.0/bin/gcc /usr/bin/gcc
ln -s /usr/local/gcc-5.4.0/bin/g++ /usr/bin/g++
gcc -v

验证

gcc -v

如果显示的gcc版本仍是以前的版本,可以重启系统;which gcc 查看gcc的安装位置。

这个时候如果编译程序会发现提示:version `GLIBCXX_3.4.21’ not found问题。

然后这里还有一个问题,就是使用的libstdc++等文件时,发现使用的还是gcc4.4.2,没有使用新的gcc编译出来的so,这个时候就需要我们去查询到最新的so,把so复制到/usr/lib64下面重新软链接。

使用下面语句查看最新so文件,注意没有权限要加上sudo。

find / -name "libstdc++.so*"
...
/home/gcc-5.4.0/gcc-temp/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.21  //最新动态库
...

复制到/usr/lib64。然后将libstdc++.so.6 软链接到最新的库上面,这里是libstdc++.so.6.0.21

ln -sf libstdc++.so.6.0.21 libstdc++.so.6

成功后可以使用strings查看,也可以查看其它文件,原理类似

strings /usr/lib64/libstdc++.so.6 | grep GLIBC