GCC,即The GNU Compiler Collection,是GNU计划的最关键组成部分。

GCC是一整套编译器的集合,大家使用的Code::Blocks使用的就是由MinGW提供的GCC编译套件。

刚刚看Debian 9的新闻的时候发现Debian 9将升级GCC到6,我看了一下,最让人振奋的是编译标准从C++98提升到了C++14,要知道C++11后这门语言已经大有不同,所以这个升级很让我心动。

GCC作为Linux最核心的一部分,没有提供现成的软件包直接安装,所以写一遍简短的笔记记一下安装过程,也给后来人参考。

文章发布时GCC 6最新的Release版本是6.3.0。安装的系统是Elementary OS 0.4,基于Ubuntu 16.04。

1. 准备

准备环节很简单,肯定要下载GCC源码。同时,还需要四个必备软件包:m4、gmp、mpc、mpfr。

在这里推荐使用中科院开源软件协会的GNU镜像,速度飞快:http://mirrors.opencas.org/gnu。

gcc、gmp、mpc、mpfr都在此下载,m4直接用apt安装就行。

下载好直接解压,用tar zxvf <文件名>就可以了。

2. 安装

安装顺序如下:

  1. 安装m4

    直接跑命令行就行:

    1
    
    sudo apt update && sudo apt install mp4 -y
  2. 安装gmp

    解压后cd进去,直接安装:

    1
    2
    3
    4
    
    make clean
    ./configure --prefix=/usr/local/gmp-6.1.2
    make
    sudo make install
  3. 安装mpfr

    也是cd进去跑命令:

    1
    2
    3
    4
    
     make clean
    ./configure --prefix=/usr/local/mpfr-3.1.5 --with-gmp=/usr/local/gmp-6.1.2
    make
    sudo make install
  4. 安装mpc

    (其实都是套路,我也不知道这里写什么好了

    1
    2
    3
    4
    5
    
    make clean
    ./configure --prefix=/usr/local/mpc-1.0.3 --with-gmp=/usr/local/gmp-6.1.2 \
    --with-mpfr=/usr/local/mpfr-3.1.5
    make
    sudo make install
  5. 安装GCC

    终于到重头戏了。

    首先是配置:

    1
    2
    3
    4
    
    make clean
    ./configure --prefix=/usr --enable-threads=posix --enable-languages=c,c++ \
    --disable-multilib --with-gmp=/usr/local/gmp-6.1.2 \
    --with-mpfr=/usr/local/mpfr-3.1.5 --with-mpc=/usr/local/mpc-1.0.3 

    这个配置有两个地方需要注意:

    1. 我直接替换了本机的GCC。如果要独立并存安装,请修改--prefix参数。
    2. 我只启用了C和C++语言,你也可以启用更多的语言,修改-enable-languages即可。

    接下来是漫长的编译过程:

    1
    
    sudo make -j16

    -j参数是多线程编译,理论上是CPU核心数两倍为宜,大家看情况调整。

    编译很漫长,可以出去玩一会儿再回来(

    编译完成后可以安装,为了防止出现问题,请一定切换到root用户进行安装:

    1
    2
    
    su -
    make install

    很快就装好啦~

3. 测试

下面就是测试。

输入

1
$ gcc -v

可以看到返回:

1
2
...
gcc 版本 6.3.0 (GCC)

编译了两个Hello World都正常。

下面测试C++11特性代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#include <iostream>

using namespace std;

int main(){
    int a[10];
    for(auto &i : a)
        i = 0;
    for(const auto &i : a)
        cout << i << endl;
    return 0;
}

不用加-std=c++11也能编译通过啦~

现在就是默认C++14标准了,又可以开心coding了~