系統自帶 GCC 版本過老導致 C++11/14 支持不全、編譯報錯,需升級。本文記錄在 CentOS 6.6 x64 上從源碼編譯安裝 GCC 4.7.4 的完整流程:依賴庫構建、編譯優化、安裝目錄規劃、update-alternatives 多版本共存切換。
# 1. 下載源碼
wget https://ftp.gnu.org/gnu/gcc/gcc-4.7.4/gcc-4.7.4.tar.bz2
tar -xf gcc-4.7.4.tar.bz2
cd gcc-4.7.4
# 2. 安裝編譯依賴 (系統包管理器)
yum install -y gmp-devel mpfr-devel libmpc-devel \
glibc-devel zlib-devel \
gcc gcc-c++ make # 需一個可用的編譯器啟動構建
GCC 4.7.4 要求:GMP 4.3.2+, MPFR 2.4.2+, MPC 0.8.1+。源碼目錄下自帶下載腳本:
# 在 gcc-4.7.4 目錄下
./contrib/download_prerequisites
# 會下載並解壓 gmp, mpfr, mpc 到當前目錄
分別構建安裝到 /usr/local (需 root):
# 1. GMP
cd gmp-4.3.2
./configure --prefix=/usr/local/gmp
make -j$(nproc)
make install
# 2. MPFR (依賴 GMP)
cd ../mpfr-2.4.2
./configure --prefix=/usr/local/mpfr --with-gmp=/usr/local/gmp
make -j$(nproc)
make install
# 3. MPC (依賴 GMP, MPFR)
cd ../mpc-0.8.1
./configure --prefix=/usr/local/mpc --with-gmp=/usr/local/gmp --with-mpfr=/usr/local/mpfr
make -j$(nproc)
make install
# 臨時生效
export LD_LIBRARY_PATH=/usr/local/gmp/lib:/usr/local/mpfr/lib:/usr/local/mpc/lib:$LD_LIBRARY_PATH
# 永久生效
echo 'export LD_LIBRARY_PATH=/usr/local/gmp/lib:/usr/local/mpfr/lib:/usr/local/mpc/lib:$LD_LIBRARY_PATH' >> /etc/profile
source /etc/profile
cd /path/to/gcc-4.7.4 # 回到 GCC 源碼根目錄
# 配置參數詳解
./configure \
--prefix=/usr/local/gcc-4.7.4 \ # 安裝目錄
--enable-threads=posix \ # POSIX 線程支持
--disable-multilib \ # 禁用多庫(32/64位共存),純64位系統加快編譯
--enable-languages=c,c++ \ # 只構建 C/C++ 前端,縮短編譯時間
--with-gmp=/usr/local/gmp \ # 指定依賴庫路徑
--with-mpfr=/usr/local/mpfr \
--with-mpc=/usr/local/mpc
# 編譯 (並行加速,根據CPU核心數調整 -j)
make -j$(nproc) # 或具體數字如 -j16
# 安裝
make install
... Leaving directory `/path/to/gcc-4.7.4' ...
安裝目錄結構:
/usr/local/gcc-4.7.4/ ├── bin/ # gcc, g++, cpp, gcov 等 ├── include/ # 頭文件 ├── lib/ # 庫文件 ├── lib64/ # 64位庫 ├── libexec/ # 內部執行文件 └── share/ # 文檔、信息頁
保留系統 GCC (4.4.7),新版優先,通過 update-alternatives 管理:
# 1. 備份系統 GCC
mv /usr/bin/gcc /usr/bin/gcc-4.4
mv /usr/bin/g++ /usr/bin/g++-4.4
# 2. 註冊替選項 (優先級數字越大優先級越高)
update-alternatives --install /usr/bin/gcc gcc /usr/local/gcc-4.7.4/bin/gcc 50
update-alternatives --install /usr/bin/gcc gcc /usr/local/gcc-4.9.3/bin/gcc 40 # 若有其他版本
update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.4 30
# 3. 交互式切換
update-alternatives --config gcc
# 輸入選項序號回車
# 4. 同理配置 g++
update-alternatives --install /usr/bin/g++ g++ /usr/local/gcc-4.7.4/bin/g++ 50
update-alternatives --install /usr/bin/g++ g++ /usr/local/gcc-4.9.3/bin/g++ 40
update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.4 30
update-alternatives --config g++
# 5. 移除替選項
update-alternatives --remove gcc /usr/bin/gcc-4.4
gcc --version
# gcc (GCC) 4.7.4
# Copyright (C) 2012 Free Software Foundation, Inc.
g++ --version
# g++ (GCC) 4.7.4
# 測試 C++11 特性
cat > test.cpp <<'EOF'
#include
#include
int main() {
auto p = std::make_unique(42);
std::cout << *p << std::endl;
return 0;
}
EOF
g++ -std=c++11 test.cpp -o test && ./test
# 輸出 42
| 問題 | 原因 | 解決 |
|---|---|---|
| configure: error: GMP not found | 依賴庫未安裝或路徑錯誤 | 檢查 --with-gmp 路徑,確認 LD_LIBRARY_PATH |
| make 失敗: crti.o not found | glibc-devel 未安裝 | yum install glibc-devel |
| 編譯極慢/卡住 | 內存不足導致 swap | 減小 -j 值,增加 swap 分區 |
| 安裝後 gcc 仍是舊版 | PATH 順序或 alternatives 未生效 | 重新登錄 shell,檢查 which gcc、update-alternatives --display gcc |
| C++ 標準庫符號找不到 | libstdc++ 路徑問題 | 確保 LD_LIBRARY_PATH 包含 /usr/local/gcc-4.7.4/lib64 |
make -j$(nproc) 大幅縮短時間 (4核約 15-20 分鐘)。--enable-languages=c,c++ 避免構建 Fortran/Java/Go 等無用前端。--disable-multilib 省時省空間。/usr/local/gcc-X.Y.Z 目錄隔離,update-alternatives 無縫切換,不污染系統環境。LD_LIBRARY_PATH 寫入 /etc/profile.d/gcc.sh 而非直接改 /etc/profile。自行編譯 GCC 不僅解決版本受限問題,更能深度理解編譯器構建鏈、依賴關係、ABI 兼容性。掌握 download_prerequisites → 分離構建依賴庫 → 配置參數裁剪 → 並行編譯 → alternatives 多版本管理 這套流程,應對任何 GCC 版本升級/交叉編譯器構建皆得心應手。