Files
my-vault/01_Projects/Work/Government-Projects/Document-Exchange/compile gcc 13.md
T

8.4 KiB
Raw Blame History


🧭 GCC 13.3.0 从源码构建指南(适用于 Kylin Linux Advanced Server V10 / RHEL 系)

目标:在 /opt/gcc-13 构建一套完全独立的新 GCC,不覆盖系统自带版本。
附带可选 /opt/binutils-2.40,用于提升链接器兼容性。


一、系统准备

1️⃣ 更新系统并安装构建依赖

sudo dnf groupinstall "Development Tools" -y
sudo dnf install -y \
  gcc gcc-c++ make bison flex texinfo git wget curl xz gawk perl python3 \
  glibc-devel glibc-headers libstdc++-devel zlib-devel \
  gmp-devel mpfr-devel libmpc-devel isl-devel

若系统仓库的 gmp/mpfr/mpc/isl 太旧,也没关系,下面会采用 内联构建


二、可选但推荐:升级 binutils (2.40)

2️⃣ 构建并安装

cd soft
wget https://mirrors.aliyun.com/gnu/binutils/binutils-2.40.tar.gz
tar -xzf binutils-2.40.tar.gz
mkdir build-binutils-2.40 && cd build-binutils-2.40

../binutils-2.40/configure \
  --prefix=/usr/local/binutils-2.40 \
  --disable-multilib \
  --enable-gold \
  --enable-ld=default \
  --enable-plugins

make -j"$(nproc)"
make install

3️⃣ 激活新版 binutils

export PATH=/usr/local/binutils-2.40/bin:$PATH

验证:

ld --version | head -1
as --version | head -1

输出应含 “2.40”。

若系统已有较新 binutils,可跳过本节。


三、下载并准备 GCC 13.3.0 源码

4️⃣ 获取源码

cd soft
wget https://mirrors.aliyun.com/gnu/gcc/gcc-13.3.0/gcc-13.3.0.tar.xz
tar -xf gcc-13.3.0.tar.xz
cd gcc-13.3.0

5️⃣ 下载依赖库(推荐)

./contrib/download_prerequisites

该脚本会自动下载合适的:

  • GMP

  • MPFR

  • MPC

  • ISL

若离线环境,可在其他机器下载后放到以下目录:

gcc-13.3.0/gmp/
gcc-13.3.0/mpfr/
gcc-13.3.0/mpc/
gcc-13.3.0/isl/

cat > contrib/download_prerequisites <<'EOF'
#!/bin/sh
# Modified for Aliyun GNU mirror + official ISL source (SourceForge)
# Author: windyboy setup helper

set -e

gmp='gmp-6.2.1.tar.bz2'
mpfr='mpfr-4.1.0.tar.bz2'
mpc='mpc-1.2.1.tar.gz'
isl='isl-0.24.tar.bz2'

fetch='wget -c --no-check-certificate'

# 阿里云 GNU 镜像基础路径
base="https://mirrors.aliyun.com/gnu"

download() {
    pkg=$1
    url=$2
    echo "==> Downloading $pkg"
    ${fetch} "$url" -O "$pkg" || {
        echo "❌ Failed: $pkg"
        exit 1
    }
}

download "$gmp"  "$base/gmp/$gmp"
download "$mpfr" "$base/mpfr/$mpfr"
download "$mpc"  "$base/mpc/$mpc"
download "$isl"  "https://libisl.sourceforge.io/$isl"

echo "==> Extracting..."
for ar in $gmp $mpfr $mpc $isl; do
    tar -xf "$ar"
    ln -sf "${ar%.tar*}" "${ar%-*}"
done

echo "✅ All prerequisites downloaded and extracted successfully (Aliyun + SourceForge)."
EOF

chmod +x contrib/download_prerequisites

四、构建并安装 GCC 13.3.0

6️⃣ 创建构建目录(out-of-tree

cd soft
mkdir build-gcc-13 && cd build-gcc-13

7️⃣ 配置参数

../gcc-13.3.0/configure \
  --prefix=/usr/local/gcc-13 \
  --enable-languages=c,c++ \
  --disable-multilib \
  --enable-checking=release \
  --enable-lto \
  --enable-threads=posix \
  --with-system-zlib

说明:

  • --disable-multilib:仅构建 64 位版,节省空间、避免冲突

  • --enable-lto:启用 Link Time Optimization

  • --enable-threads=posix:标准线程支持

  • --with-system-zlib:若安装了 zlib-devel


8️⃣ 编译与安装

make -j"$(nproc)"
make install

💡 提示:

  • 首次编译耗时较久(1560 分钟)。

  • 若出现 OOM,可降并行度:

    sudo make -j4
    

五、启用与测试新 GCC

9️⃣ 临时启用

export PATH=/usr/local/gcc-13/bin:$PATH
export LD_LIBRARY_PATH=/usr/local/gcc-13/lib64:$LD_LIBRARY_PATH

🔟 验证版本

gcc -v
g++ -v

应显示:

gcc version 13.3.0 (GCC)

测试代码:

cat > hello.cpp <<'EOF'
#include <iostream>
int main() { std::cout << "Hello GCC " << __VERSION__ << std::endl; }
EOF
g++ -std=c++20 hello.cpp -O2 -o hello
./hello

输出应为:

Hello GCC 13.3.0

六、长期使用与并存管理

11️⃣ 持久化环境变量

用户级:

echo 'export PATH=/opt/gcc-13/bin:$PATH' >> ~/.bashrc
echo 'export LD_LIBRARY_PATH=/opt/gcc-13/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
source ~/.bashrc

系统级(所有用户生效):

sudo tee /etc/profile.d/gcc13.sh <<'EOF'
export PATH=/opt/gcc-13/bin:$PATH
export LD_LIBRARY_PATH=/opt/gcc-13/lib64:$LD_LIBRARY_PATH
EOF
sudo chmod +x /etc/profile.d/gcc13.sh

12️⃣ 运行时库兼容性(关键)

若运行你的程序时报:

GLIBCXX_3.x.y not found

说明运行期加载了系统旧版 libstdc++。
解决办法:

  1. 临时解决:

    export LD_LIBRARY_PATH=/opt/gcc-13/lib64:$LD_LIBRARY_PATH
    
  2. 编译期内嵌 rpath

    g++ main.cpp -Wl,-rpath=/opt/gcc-13/lib64 -O2 -o app
    

七、常见问题与修复要点

问题 原因 解决方案
configure: error: GMP/MPFR/MPC not found 系统库过旧或缺失 使用 contrib/download_prerequisites
collect2: error: ld returned 1 exit status binutils 太旧 启用 /opt/binutils-2.40 并确认 PATH
checking for sufficient default stack space... no 栈空间不足 执行 ulimit -s unlimited
cc1plus: out of memory 并行过高或 swap 不足 降低并行度、添加 swap

八、验证构建质量(可选)

自检:

cd /usr/local/src/build-gcc-13
sudo make -k check > test.log 2>&1
grep -A2 "Summary" test.log

成功率通常 > 99%,剩余测试多为非致命的浮点容差差异。


总结:完整流程一览

# 一次性复现构建流程 (示例版)
sudo dnf groupinstall "Development Tools" -y
sudo dnf install -y gcc gcc-c++ make bison flex texinfo git wget curl xz gawk perl python3 \
  glibc-devel glibc-headers libstdc++-devel zlib-devel gmp-devel mpfr-devel libmpc-devel isl-devel

cd /usr/local/src
sudo wget https://ftp.gnu.org/gnu/binutils/binutils-2.40.tar.xz
sudo tar -xf binutils-2.40.tar.xz
sudo mkdir build-binutils-2.40 && cd build-binutils-2.40
sudo ../binutils-2.40/configure --prefix=/opt/binutils-2.40 --disable-multilib --enable-gold --enable-ld=default --enable-plugins
sudo make -j"$(nproc)" && sudo make install
export PATH=/opt/binutils-2.40/bin:$PATH

cd /usr/local/src
sudo wget https://ftp.gnu.org/gnu/gcc/gcc-13.3.0/gcc-13.3.0.tar.xz
sudo tar -xf gcc-13.3.0.tar.xz
cd gcc-13.3.0 && ./contrib/download_prerequisites

cd /usr/local/src && sudo mkdir build-gcc-13 && cd build-gcc-13
sudo ../gcc-13.3.0/configure --prefix=/opt/gcc-13 --enable-languages=c,c++ --disable-multilib \
  --enable-checking=release --enable-lto --enable-threads=posix --with-system-zlib
sudo make -j"$(nproc)" && sudo make install

echo 'export PATH=/opt/gcc-13/bin:$PATH' | sudo tee /etc/profile.d/gcc13.sh
echo 'export LD_LIBRARY_PATH=/opt/gcc-13/lib64:$LD_LIBRARY_PATH' | sudo tee -a /etc/profile.d/gcc13.sh
sudo chmod +x /etc/profile.d/gcc13.sh
source /etc/profile.d/gcc13.sh

是否希望我把上述完整命令整理成 一键可执行的 build-gcc13.sh 脚本(带错误检查、日志输出、并自动检测是否已安装 binutils)?
这样你只需运行一行命令即可完成全部流程。

openssl

./Configure --prefix=/usr/local/openssl-3 \
            --openssldir=/usr/local/openssl-3/ssl \
            shared zlib \
            enable-ec_nistp_64_gcc_128 \
            enable-tls1_3
make -j$(nproc)
make install
export CC=/usr/local/gcc-13/bin/gcc
export CXX=/usr/local/gcc-13/bin/g++
export CPPFLAGS="-I/usr/local/openssl-3/include"
export LDFLAGS="-L/usr/local/openssl-3/lib64"
echo "/usr/local/openssl-3/lib64" | sudo tee /etc/ld.so.conf.d/openssl-3.conf
export CPPFLAGS="-I/usr/local/openssl-3/include"
export LDFLAGS="-L/usr/local/openssl-3/lib -Wl,-rpath=/usr/local/openssl-3/lib"
export PKG_CONFIG_PATH="/usr/local/openssl-3/lib/pkgconfig"
export LD_LIBRARY_PATH="/usr/local/openssl-3/lib:$LD_LIBRARY_PATH"
export PATH="/usr/local/openssl-3/bin:$PATH"

./configure \
  --prefix=/usr/local/openssh-10 \
  --sysconfdir=/usr/local/openssh-10/etc \
  --with-ssl-dir=/usr/local/openssl-3 \
  --with-pam \
  --with-md5-passwords