這裡介紹在樹莓派中自行編譯與安裝 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 時好像會需要這些額外的套件,我不是很確定是否一定要安裝:
sudo apt-get install libgmp-dev libmpfr-dev libmpc-dev
參考資料:Solarian Programmer、ChoccyHobNob、GCC FAQ