由于公司有个项目在公安系统中,无法连接到外网,所以导致无法在网上直接安装一些软件,同时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