Linux(centos) gcc/g++升级从版本4.4.7到4.8.5

1、首先进入目录目录/usr/local/src,下载安装包

wget http://ftp.gnu.org/gnu/gcc/gcc-4.8.5/gcc-4.8.5.tar.gz

然后解压压缩包

tar -zxvf gcc-4.8.5.tar.gz

2、进入解压缩的目录cd gcc-4.8.5,下载一些必备的依赖程序

./contrib/download_prerequisites

上面的命令执行承购可不看2后面的内容

安装gcc需要下载诸如gmp、mpfr、mpc等依赖文件,执行download_prerequisites将会自动下载这些软件并解压到当前目录(下载过程中可能会出现“PASV ... couldn’t connect to 8.43.85.97 port 43014: Connection timed out。“,耐心等待即可。如果网络不OK时,可打开 ./contrib/download_prerequisites 文件按照文件中的内容下载对应版本的依赖程序,并解压到/usr/local/src/gcc-4.8.5目录,同时创建对应的软连接,gcc-4.8.5的download_prerequisites如下:

MPFR=mpfr-2.4.2
GMP=gmp-4.3.2
MPC=mpc-0.8.1

wget ftp://gcc.gnu.org/pub/gcc/infrastructure/$MPFR.tar.bz2 || exit 1
tar xjf $MPFR.tar.bz2 || exit 1
ln -sf $MPFR mpfr || exit 1

wget ftp://gcc.gnu.org/pub/gcc/infrastructure/$GMP.tar.bz2 || exit 1
tar xjf $GMP.tar.bz2  || exit 1
ln -sf $GMP gmp || exit 1

wget ftp://gcc.gnu.org/pub/gcc/infrastructure/$MPC.tar.gz || exit 1
tar xzf $MPC.tar.gz || exit 1
ln -sf $MPC mpc || exit 1

rm $MPFR.tar.bz2 $GMP.tar.bz2 $MPC.tar.gz || exit 1

所以需要下载三个依赖程序:mpfr、gmp和mpc,在 ftp://gcc.gnu.org/pub/gcc/infrastructure/ 目录下依次找到对应的三个文件,并下载后放在/usr/local/src/gcc-4.8.5目录下,每个依赖库的目录使用ln -sf做成软连接即可。

步骤如下:cd /usr/local/src/gcc-4.8.5/

wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpfr-2.4.2.tar.bz2
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/gmp-4.3.2.tar.bz2
wget ftp://gcc.gnu.org/pub/gcc/infrastructure/mpc-0.8.1.tar.gz
tar -jvzf gmp-4.3.2.tar.bz2
ln –sf gmp-4.3.2 gmp

tar -jxvf mpfr-2.4.2.tar.bz2
ln –sf mpfr-2.4.2 mpfr

tar -xvzf mpc-0.8.1.tar.gz
ln –sf mpc-0.8.1 mpc

3、当前目录创建安装目录

mkdir build
cd build

4、编译安装gcc

../configure --prefix=/usr/local/gcc --enable-languages=c,c++ --disable-multilib
#编译gcc源程序
make
#安装gcc
make install
如果机器性能比较差,建议后台执行,防止ssh断开链接程序中止
比如:
nohup make >> ~/make_process.log
nohup make install >> ~/make_process.log

其中执行make命令这一过程耗费的时间可能非常多。执行完上述命令后,我们的gcc就已经安装成功了。

GCC 和G++均安装在/usr/local/gcc/bin/ 下,如果需要自己指定安装目录,在configure后面指定参数 --prefix=/your/path 即可。

5、解决GLIBC版本未更新问题

编译或者运行时,会出现GLIBC版本找不到的问题,如下提示:

/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found
/usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.15' not found

主要是因为升级时,生成的动态库没有替换老版本gcc的动态库导致的,将gcc最新版本的动态库替换系统中老版本的动态库即可解决。

运行以下命令检查动态库:

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

输出结果如下:

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBC_2.2.5
GLIBC_2.3
GLIBC_2.4
GLIBC_2.3.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

 从以上输出可以看出,gcc的动态库还是旧版本的。说明出现这些问题,是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库。

按道理说安装的时候会自动更新动态库,我们可以在根目录手动搜索一下:

find ./ -name libstdc++.so.6*  

输出结果如下:

/usr/share/gdb/auto-load/usr/lib/libstdc++.so.6.0.13-gdb.pyo
/usr/share/gdb/auto-load/usr/lib/libstdc++.so.6.0.13-gdb.pyc
/usr/share/gdb/auto-load/usr/lib/libstdc++.so.6.0.13-gdb.py
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.13-gdb.pyo
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.13-gdb.pyc
/usr/share/gdb/auto-load/usr/lib64/libstdc++.so.6.0.13-gdb.py
/usr/lib64/libstdc++.so.6.0.13
/usr/lib64/libstdc++.so.6
/usr/local/src/gcc-4.8.5/build/prev-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.19
/usr/local/src/gcc-4.8.5/build/prev-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/usr/local/src/gcc-4.8.5/build/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.19
/usr/local/src/gcc-4.8.5/build/stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/usr/local/src/gcc-4.8.5/build/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.19
/usr/local/src/gcc-4.8.5/build/x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6
/usr/local/gcc/lib64/libstdc++.so.6.0.19
/usr/local/gcc/lib64/libstdc++.so.6.0.19-gdb.py
/usr/local/gcc/lib64/libstdc++.so.6

我们发现,gcc安装时把libstdc++.so.6.0.19 安装到了/usr/local/gcc/lib64下,但并没有改变/usr/lib64/libstdc++.so.6的链接指向。那么我们将/usr/local/gcc/lib64/libstdc++.so.6.0.19手动拷贝到/usr/lib64/,并更新libstdc++.so.6软连接(也可以直接指向/usr/local/gcc/lib64/libstdc++.so.6.0.19,不用拷贝, 看各自的文件管理习惯),其中/usr/local/src/gcc-4.8.5/build/目录下的库文件为都是编译输出文件,stage1-x86_64-unknown-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.19为gcc新版本编译最终生成的lib库文件,和/usr/local/gcc/lib64/libstdc++.so.6.0.19是一模一样的。更新lib库的操作命令如下:

cp /usr/local/gcc/lib64/libstdc++.so.6.0.19 /usr/lib64
rm -rf /usr/lib64/libstdc++.so.6
ln -s /usr/lib64/libstdc++.so.6.0.19 /usr/lib64/libstdc++.so.6

再次检测,strings /usr/lib64/libstdc++.so.6 | grep GLIBC

显示如下证明成功

GLIBCXX_3.4
GLIBCXX_3.4.1
GLIBCXX_3.4.2
GLIBCXX_3.4.3
GLIBCXX_3.4.4
GLIBCXX_3.4.5
GLIBCXX_3.4.6
GLIBCXX_3.4.7
GLIBCXX_3.4.8
GLIBCXX_3.4.9
GLIBCXX_3.4.10
GLIBCXX_3.4.11
GLIBCXX_3.4.12
GLIBCXX_3.4.13
GLIBCXX_3.4.14
GLIBCXX_3.4.15
GLIBCXX_3.4.16
GLIBCXX_3.4.17
GLIBCXX_3.4.18
GLIBCXX_3.4.19
GLIBC_2.3
GLIBC_2.2.5
GLIBC_2.3.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

 6、替换系统低版本gcc

系统自带低版本gcc文件位置为/usr/bin/gcc/usr/bin/lib,此时需要将这两个部分删掉,或者后缀加上.bak,然后通过建立软连接的方式替换系统默认位置的gccc++g++文件。

mv /usr/bin/c++ /usr/bin/c++.bak
ln -s /usr/local/gcc/bin/c++ /usr/bin/c++
mv /usr/bin/g++ /usr/bin/g++.bak
ln -s /usr/local/gcc/bin/g++ /usr/bin/g++
mv /usr/bin/gcc /usr/bin/gcc.bak 
ln -s /usr/local/gcc/bin/gcc /usr/bin/gcc

7、重新进入系统,查看gcc,g++版本发现已改变,正确。

gcc --version
g++ --version

 或

gcc -v
g++ -v

 升级完成

发布了24 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_39359584/article/details/104763805