Linux之gcc升级

做为Linux环境下的C语言编译器,在部署服务时往往对gcc版本提出了要求,一般原生系统里的gcc版本为4.4.7.这里演示如何将4.7版本升级至6.4.0

前期准备

gcc安装包:https://gcc.gnu.org/mirrors.html

开工

  1. 查看动态库:4.4.7的版本动态库最高是GLIBCXX_3.4.13
    strings /usr/lib64/libstdc++.so.6 | grep GLIBC
  2. 做一个测试,旧版本的gcc是不支持新版本特性,创建一个test.cc文件写入以下代码
#include 
#include 
int main()
{
std::shared_ptr<int> pInt(new int(5));
std::cout << *pInt << std::endl;
return 0;
}
g++ -std=c++11 -o test test.cc
#报错信息
cc1plus: error: unrecognized command line option "-std=c++11"
  1. 解压gcc安装包后,进入安装目录执行:
./contrib/download_prerequisites

在执行该脚本后,脚本会自动帮我们下载和安装以下库:mpfr-2.4.2.tar.bz2、gmp-4.3.2.tar.bz2、mpc-0.8.1.tar.gz和isl-0.15.tar.bz2,如果服务器无法连接外网的话,可到以下链接下载这四个库自行安装:注意要把这几个安装包解压到gcc安装目录下,https://pan.baidu.com/s/11oC6Z5Jxe8kjsmWEoXYczg 提取密码:qqgk
为实现自己安装,需要查看一下download_prerequisites具体做了什么。一起来看看他的脚本代码:

# 
# You should have received a copy of the GNU General Public License
# along with this program. If not, see http://www.gnu.org/licenses/.

# If you want to disable Graphite loop optimizations while building GCC,
# DO NOT set GRAPHITE_LOOP_OPT as yes so that the isl package will not
# be downloaded.
GRAPHITE_LOOP_OPT=yes

if [ ! -e gcc/BASE-VER ] ; then
        echo "You must run this script in the top level GCC source directory."
        exit 1
fi

# Necessary to build GCC.
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

# Necessary to build GCC with the Graphite loop optimizations.
if [ "$GRAPHITE_LOOP_OPT" = "yes" ] ; then
  ISL=isl-0.15

  wget ftp://gcc.gnu.org/pub/gcc/infrastructure/$ISL.tar.bz2 || exit 1
  tar xjf $ISL.tar.bz2  || exit 1
  # Fix trailing comma which errors with -pedantic for host GCC <= 4.3
  sed -e 's/isl_stat_ok = 0,/isl_stat_ok = 0/' isl-0.15/include/isl/ctx.h > isl-0.15/include/isl/ctx.h.tem && mv isl-0.15/include/isl/ctx.h.tem isl-0.15/include/isl/ctx.h
  ln -sf $ISL isl || exit 1
fi

除安装isl外,其他的都只是核心三步:

  • 下载安装包
  • 解压包
  • 将解压后的包链接到文件简写:如gmp,mpc
    isl的安装复杂些:除了上述基本的下载,解压,在建立链接之前需要做另外一些操作:
sed -e 's/isl_stat_ok = 0,/isl_stat_ok = 0/' isl-0.15/include/isl/ctx.h > isl-0.15/include/isl/ctx.h.tem
mv isl-0.15/include/isl/ctx.h.tem isl-0.15/include/isl/ctx.h
ln -sf $ISL isl 

这里还是推荐直接运行down_prerequisites脚本,可以节约许多时间和错误
5. 完成依赖库的安装后,在gcc安装目录下执行:./configure -enable-checking=release -enable-languages=c,c++ -disable-multilib,有些教程里推荐另外建一个build文件作为接下来的编译文档,其实没差,文件的放置位置也有讲究,不然会报错,这里就直接在安装目录执行该命令。
6. make -j4这一步比较耗时,个把小时属于正常现象
7. make install,默认安装位置是在/usr/local/bin下,安装完成后可以查看一下是否已有文件安装
8. ls /usr/local/bin | grep gcc
Linux之gcc升级_第1张图片
9. 配置gcc,找到libstdc++.so.6.0.22所在目录,找到后将其复制到/usr/lib64下

cd /usr/lib64
cp /home/ceshi/gcc-6.4.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22 ./
mv libstdc++.so.6 libstdc++.so.6.old
ln -sv libstdc++.so.6.0.22 libstdc++.so.6

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

#推荐这里进入/usr/bin下再执行命令,不然像mv ./g++这句会报错
mv /usr/bin/c++ /usr/bin/c++.bak
 ln -s /usr/local/bin/c++ /usr/bin/c++
 mv ./g++ ./g++.bak
 ln -s /usr/local/bin/g++ /usr/bin/g++
 mv ./gcc ./gcc.bak 
 ln -s /usr/local/bin/gcc /usr/bin/gcc

11.至此安装大功告成,输入gcc -v查看吧,也可以编译运行文章开始创建的测试文件测试是否能用上新的gcc

g++ -std=c++11 -o test test.cc
./test
#顺利的话结果是5

参考链接

主要参考流程在此
补充上文不足-添加gcc链接
配置多个gcc版本

附上安装脚本

echo 1.安装gcc6.1.0环境
yum -y install gcc-c++
yum -y install make
yum -y install libtool
yum -y install bzip2.x86_64 

echo 2.解压gcc6.1.0及其依赖
export workdir=$PWD
tar -xzvf gcc-6.1.0.tar.gz || exit 1
cd gcc-6.1.0
./contrib/download_prerequisites

echo 3.安装gcc6.1.0
mkdir gcc-build-6.1.0 || exit 1
cd gcc-build-6.1.0
../configure -enable-checking=release -enable-languages=c,c++ -disable-multilib
make -j4 || exit 1
make install ||exit 1

echo 4.更新gcc动态链接库
cd /usr/lib64 || exit 1
cp $workdir/gcc-6.1.0/gcc-build-6.1.0/stage1-x86_64-pc-linux-gnu/libstdc++-v3/src/.libs/libstdc++.so.6.0.22 . || exit 1
rm -rf libstdc++.so.6 || exit 1
ln -s libstdc++.so.6.0.22 libstdc++.so.6 || exit 1

echo 5.Cmake环境设置
echo 'export CC=/usr/local/bin/gcc' >> /etc/profile
echo 'export CXX=/usr/local/bin/g++' >> /etc/profile
source /etc/profile

ls /usr/local/bin | grep gcc
gcc -v

你可能感兴趣的:(Linux之gcc升级)