首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

CentOS 6.6 編譯安裝 GCC 4.7.4 完整實踐:依賴庫、配置參數、多版本切換

     編輯:關於C語言

CentOS 6.6 編譯安裝 GCC 4.7.4 完整實踐:依賴庫、配置參數、多版本切換

系統自帶 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  # 需一個可用的編譯器啟動構建

二、編譯核心依賴庫 (GMP, MPFR, MPC)

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

三、編譯安裝 GCC 4.7.4


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 foundglibc-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

七、最佳實踐總結

  1. 源碼目錄內構建:GCC 官方推薦在源碼根目錄配置,而非單獨 build 目錄 (避免依賴庫路徑混亂)。
  2. 並行編譯:make -j$(nproc) 大幅縮短時間 (4核約 15-20 分鐘)。
  3. 精簡語言:--enable-languages=c,c++ 避免構建 Fortran/Java/Go 等無用前端。
  4. 禁用多庫:純 64 位系統 --disable-multilib 省時省空間。
  5. 版本隔離:/usr/local/gcc-X.Y.Z 目錄隔離,update-alternatives 無縫切換,不污染系統環境。
  6. 環境變量持久化:LD_LIBRARY_PATH 寫入 /etc/profile.d/gcc.sh 而非直接改 /etc/profile。

自行編譯 GCC 不僅解決版本受限問題,更能深度理解編譯器構建鏈、依賴關係、ABI 兼容性。掌握 download_prerequisites → 分離構建依賴庫 → 配置參數裁剪 → 並行編譯 → alternatives 多版本管理 這套流程,應對任何 GCC 版本升級/交叉編譯器構建皆得心應手。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved