這裡介紹在樹莓派中自行編譯與安裝 gcc 6 編譯器的步驟。

目前樹莓派的 Raspbian Linux 作業系統內建的 gcc 版本為 4.9.2

gcc --version
gcc (Raspbian 4.9.2-10) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

如果需要更新版的 gcc 編譯器,就只能自己編譯了,以下是下載 gcc 編譯器原始碼,自行編譯與安裝的過程。

下載 GCC 6 原始碼

gcc 的原始碼可以從 GCC 的官方網站下載,在官方網站上有列出全球各地的鏡像站,任選一個站來下載即可。

wget 下載目前最新的 gcc 6.3 版:

wget http://mirrors.concertpass.com/gcc/releases/gcc-6.3.0/gcc-6.3.0.tar.bz2

編譯 GCC 6

由於編譯 gcc 需要非常大的儲存空間與記憶體,在進行編譯之前,請先調整一下樹莓派的 swap 交換空間大小,確認一下 swap 空間至少有 1GB 以上,而儲存空間至少要有 4.6GB 以上(建議 5GB),若 MicroSD 記憶卡空間不足,可以暫時插入一隻 USB 隨身碟擴充,等編譯與安裝完成後再拔掉。

解壓縮 gcc 原始碼:

tar jxvf gcc-6.3.0.tar.bz2

進入 gcc 原始碼目錄:

cd gcc-6.3.0/

下載其他必要的原始碼:

contrib/download_prerequisites

建立編譯用的目錄:

mkdir ../gcc-build
cd ../gcc-build

在 Raspberry Pi 3 中使用以下參數執行 configure

../gcc-6.3.0/configure -v 
  --enable-languages=c,c++ 
  --with-cpu=cortex-a53 
  --with-fpu=neon-fp-armv8 
  --with-float=hard 
  --build=arm-linux-gnueabihf 
  --host=arm-linux-gnueabihf 
  --target=arm-linux-gnueabihf 
  --prefix=/usr/local/gcc-6.3.0

執行 make 編譯 gcc 6:

make -j4

在 Raspberry Pi 3 中使用四核心的 CPU 編譯大約需要六個小時,編譯完成後,進行安裝:

sudo mkdir /usr/local/gcc-6.3.0
sudo chown pi:pi /usr/local/gcc-6.3.0
make install

檢查一下新的 gcc 版本:

/usr/local/gcc-6.3.0/bin/gcc -v
Using built-in specs.
COLLECT_GCC=/usr/local/gcc-6.3.0/bin/gcc
COLLECT_LTO_WRAPPER=/usr/local/gcc-6.3.0/libexec/gcc/arm-linux-gnueabihf/6.3.0/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../gcc-6.3.0/configure -v --enable-languages=c,c++ --with-cpu=cortex-a53 --with-fpu=neon-fp-armv8 --with-float=hard --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf --prefix=/usr/local/gcc-6.3.0
Thread model: posix
gcc version 6.3.0 (GCC)

順便檢查 g++ 的版本:

/usr/local/gcc-6.3.0/bin/g++ -v
Using built-in specs.
COLLECT_GCC=/usr/local/gcc-6.3.0/bin/g++
COLLECT_LTO_WRAPPER=/usr/local/gcc-6.3.0/libexec/gcc/arm-linux-gnueabihf/6.3.0/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../gcc-6.3.0/configure -v --enable-languages=c,c++ --with-cpu=cortex-a53 --with-fpu=neon-fp-armv8 --with-float=hard --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf --prefix=/usr/local/gcc-6.3.0
Thread model: posix
gcc version 6.3.0 (GCC)

根據 C++ Standards Support in GCC 的說明,u8 這個萬國碼的語法要在 gcc 6 以後才支援,這裡我們用剛編譯好的 gcc 6.3 測試一下,建立一個 u8.cpp 測試程式:

#include <iostream>
int main() {
  const char str[] = u8"Hello, world.";
  std::cout << str << std::endl;
  return 0;
}

用 6.3 版的 g++ 編譯:

/usr/local/gcc-6.3.0/bin/g++ u8.cpp

如果換成預設的 g++ 就會有問題:

g++ u8.cpp
u8.cpp: In function ‘int main()’:
u8.cpp:3:22: error: ‘u8’ was not declared in this scope
   const char str[] = u8"Hello, world.";
                      ^

另外 gcc 6.3 版編譯程式若遇到錯誤,其輸出的訊息是有顏色的:

GCC 6.3 編譯輸出訊息

這樣閱讀起來會更舒服。

最後補充一點,編譯 gcc 時好像會需要這些額外的套件,我不是很確定是否一定要安裝:

sudo apt-get install libgmp-dev libmpfr-dev libmpc-dev

參考資料:Solarian ProgrammerChoccyHobNobGCC FAQ