我用 LinuxLinuxLinux学习之路

升级gcc

2019-07-04  本文已影响0人  _给我一支烟_

很多时候 Linux 系统自带的 gcc 版本过低导致 C++11 的程序无法编译,升级 gcc 到6.1.0。

1、 下载安装包并解压

wget http://ftp.gnu.org/gnu/gcc/gcc-6.1.0/gcc-6.1.0.tar.bz2
tar -jxvf gcc-6.1.0.tar.bz2

2、 下载供编译需求的依赖项

执行脚本文件会帮我们下载、配置、安装依赖库,可以节约我们大量的时间和精力。

cd gcc-6.1.0
./contrib/download_prerequisites 

3、 建立一个目录供编译出的文件存放

mkdir gcc-build-6.1.0
cd gcc-build-6.1.0

4、 生成Makefile文件

../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib

5、 编译

make 

-j4选项是make对多核处理器的优化,如果不成功请使用 make
(注意:此步骤非常耗时,虚拟机耗时近3小时,实体机近80分钟,CPU基本是满的,内存也使用不少)

如果出现 /lib/cpp fails sanity check 错误的解决方法
出现该情况是由于c++编译器的相关package没有安装
yum install glibc-headers gcc-c++

6、 安装

make install

(安装需要root权限!)

查看安装情况

[root@localhost ~]# ls /usr/local/bin | grep gcc
gcc
gcc-ar
gcc-nm
gcc-ranlib
x86_64-pc-linux-gnu-gcc
x86_64-pc-linux-gnu-gcc-6.1.0
x86_64-pc-linux-gnu-gcc-ar
x86_64-pc-linux-gnu-gcc-nm
x86_64-pc-linux-gnu-gcc-ranlib

7、 重启,然后查看gcc版本

gcc -v

8 写个C++11程序测试

执行时报错 /usr/lib64/libstdc++.so.6: version `GLIBCXX_3.4.14' not found (required by ./a.out)
这是因为升级gcc时,生成的动态库没有替换老版本gcc的动态库导致的,将gcc最新版本的动态库替换系统中老版本的动态库即可解决。

9、替换老版本gcc的动态库

9.1 运行以下命令检查动态库
strings /usr/lib64/libstdc++.so.6 | grep GLIBC

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

9.2 查找编译gcc时生成的最新动态库
find / -name "libstdc++.so*"

将上面的最新动态库libstdc++.so.6.0.22复制到/usr/lib64目录下

cd /usr/lib64
cp /home/hupeng/tools/gcc-6.1.0/gcc-build-6.1.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22 ./
9.3 删除原来软连接
rm -rf libstdc++.so.6
9.4 将默认库的软连接指向最新动态库
ln -s libstdc++.so.6.0.22 libstdc++.so.6
9.5 重新检查动态库:
strings /usr/lib64/libstdc++.so.6 | grep GLIBC

[root@localhost ~]# 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
GLIBCXX_3.4.20
GLIBCXX_3.4.21
GLIBCXX_3.4.22
GLIBC_2.3
GLIBC_2.2.5
GLIBC_2.3.2
GLIBCXX_FORCE_NEW
GLIBCXX_DEBUG_MESSAGE_LENGTH

可以看到已经有需要的 GLIBCXX 版本了。

10、 备份老版 gcc 可执行文件

gcc 升级完成后,可能还会碰到如下错误

error: #error "GCC 4.8 or later required

查看 gcc 的可执行文件目录

whereis gcc

分别到 目录下面执行 ./gcc 可以看到它们的版本,发现
/usr/bin/gcc : 老版本的 gcc 可执行文件
/usr/local/bin/gcc:升级后的 gcc 可执行文件

mv /usr/bin/gcc /usr/bin/gcc_bk4.4.7
上一篇下一篇

猜你喜欢

热点阅读