很多时候 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 -v 可以看到它们的版本,发现
/usr/bin/gcc : 老版本的 gcc 可执行文件
/usr/local/bin/gcc:升级后的 gcc 可执行文件
mv /usr/bin/gcc /usr/bin/gcc_bk4.4.7