在Ubuntu14.04下安装gcc 5.3.0解决C++11支持问题

时间:2021-07-03 02:19:21

在学习《C++ Primer》时,我用的环境是Ubuntu14.04,采用DPKG机制最新能使用的gcc版本是4.8.4,虽然这个版本已经对C++11支持的已经很好了,但是还是有一些小问题。
例如,对于string类型,可以使用insert(p,b,e) 将迭代器b,e指定范围内的元素插入到迭代器p指向的元素之前。在c++11标准下,insert返回的是第一个新加入元素的迭代器,旧版本中返回void;在使用g++ 4.8进行编译的时候会报错,提醒insert返回的是void类型,无法用上述函数返回一个迭代器。
解决上述问题可以通过安装更高版本的gcc来解决问题,我安装的是gcc5.3.0来解决。


下载解压缩

gcc镜像站点上下载GCC5.3,可供下载的文件有两种形式:gcc-5.3.0.tar.gz和gcc-5.3.0.tar.bz2。两种文件的内容都是一样的。
通过tar -xzvf gcc-5.3.0.tar.gz 或者tar -xjvf gcc-5.3.0.tar.gz 解压相应的文件,解压后得到目录gcc-5.3.0,在gcc-5.3.0/INSTALL里面有详细的安装说明。


安装依赖

编译gcc源码时需要安装GMPMPFR,MPC三个依赖,下载最新版本。我下的三个版本分别是gmp-6.1.0,mpc-1.0.3,mpfr-3.1.3。

最先安装GMP,解压GMP的压缩包后,得到源代码目录gmp-6.1.0。在该目录的同级目录下建立一个临时的编译目录,这里命名为temp。为了防止在安装目录下编译产生的目录产生混乱,然后开始配置安装选项,进入temp目录,输入以下命令进行配置:
../gmp-6.1.0/configure –prefix=/usr/local/gmp-6.1.0
make
sudo make install

之后清空temp,安装MPFR,配置的时候需要添加依赖关系
rm -r *
../mpfr-3.1.3/configure –prefix=/usr/local/mpfr-3.1.3 –with-gmp=/usr/local/gmp-6.1.0

最后安装MPC,清空temp添加GMP,MPFR依赖。
rm -r *
../mpc-1.0.3/configure –prefix=/usr/local/mpc-1.0.3 –with-gmp=/usr/local/gmp-6.1.0 –with-mpfr=/usr/local/mpfr-3.1.3

安装好这三个依赖之后才可以安装gcc,否则编译的时候会报错


编译安装GCC

再次清空temp首先配置GCC,在temp文件夹中执行以下命令,注意,此时temp和gcc-5.3.0在同级目录下
../gcc-5.3.0/configure –prefix=/usr/local/gcc-5.3 –enable-threads=posix –disable-checking –disable-multilib –enable-languages=c,c++,java,objc –with-gmp=/usr/local/gmp-6.1.0 –with-mpfr=/usr/local/mpfr-3.1.3 –with-mpc=/usr/local/mpc-1.0.3
在配置时,对于语言language=选项,可以根据自己需要的编译器选择语言。
make
sudo make install
至此GCC5.3安装完毕。


配置环境变量

此时系统中存在两个版本的gcc,一个是/usr/bin/gcc , 另一个是/usr/local/gcc-5.3/ 如不修改环境变量,在每次调用5.3版本的gcc时都需要指定路径。为了方便使用,可以在/usr/bin目录下做一个符号链接

cd /usr/bin
ln -s /usr/local/gcc-5.3/bin/gcc gcc53
ln -s /usr/local/gcc-5.3/bin/g++ g++53

这样就可以使用gcc53 g++53来调用程序了,旧版本的gcc,g++仍然可以适用。

对于库路径同样需要设置下,这样,保证在调用库函数的时候可以适用到新版编译器的库函数,在etc/profile文件中适用root权限添加如下代码

export  LD_LIBRARY_PATH=/usr/local/gcc-5.3/lib:/usr/local/gcc-5.3/lib64:$LD_LIBRARY_PATH

注销重新登录,使变量生效


至此,gcc5.3安装完毕,解决了上述C++11的支持问题。