强曰为道

与天地相似,故不违。知周乎万物,而道济天下,故不过。旁行而不流,乐天知命,故不忧.
文档目录

02 - 安装与环境配置

02 - 安装与环境配置

在各主流操作系统上安装 GCC,配置交叉编译工具链,实现多版本共存。


2.1 Linux 上安装 GCC

Ubuntu / Debian

Ubuntu 和 Debian 使用 APT 包管理器,build-essential 元包包含 GCC、G++、make 和基础库。

# 更新包索引
sudo apt update

# 安装基本编译工具(GCC + make + libc-dev)
sudo apt install build-essential

# 验证安装
gcc --version
g++ --version
make --version

# 安装特定版本的 GCC(以 GCC-13 为例)
sudo apt install gcc-13 g++-13

# 查看已安装的 GCC 版本
ls /usr/bin/gcc-*

# 设置默认版本(update-alternatives)
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 100
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 100

# 交互式选择默认版本
sudo update-alternatives --config gcc
sudo update-alternatives --config g++

从 PPA 安装更新版本

# 添加 Ubuntu Toolchain PPA(获取最新 GCC)
sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt update

# 安装最新稳定版
sudo apt install gcc-14 g++-14

# 验证
gcc-14 --version

安装常用开发库和工具

# 常用开发头文件和库
sudo apt install libc6-dev libstdc++-13-dev

# 调试工具
sudo apt install gdb

# 构建工具
sudo apt install cmake ninja-build

# 静态分析工具
sudo apt install cppcheck clang-tidy

# 文档工具
sudo apt install doxygen graphviz

Fedora / RHEL / CentOS

# Fedora
sudo dnf install gcc gcc-c++ make

# RHEL / CentOS 8+
sudo dnf groupinstall "Development Tools"

# CentOS 7(使用 yum)
sudo yum groupinstall "Development Tools"

# 安装额外版本(Fedora)
sudo dnf install gcc-toolset-13 gcc-toolset-13-gcc-c++

# 启用特定工具集(不需要切换系统默认)
scl enable gcc-toolset-13 bash

# 验证
gcc --version

Arch Linux

# 安装基础开发工具
sudo pacman -S base-devel

# 验证
gcc --version
make --version

# Arch 滚动更新,始终保持最新稳定版 GCC

openSUSE

# 安装开发工具
sudo zypper install -t pattern devel_basis

# 或手动安装
sudo zypper install gcc gcc-c++ make

2.2 macOS 上安装 GCC

macOS 自带的 cc / clang 是 Apple 的 LLVM/Clang,而非 GCC。如需使用真正的 GCC:

方式一:仅安装 Xcode 命令行工具(推荐)

# 安装 Xcode CLT(提供 clang,对大多数场景已足够)
xcode-select --install

# 验证
cc --version
# Apple clang version 15.0.0 (clang-1500.3.9.4)

方式二:通过 Homebrew 安装 GCC

# 安装 Homebrew(如未安装)
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

# 安装 GCC
brew install gcc

# Homebrew 安装的 GCC 以版本号作为后缀,避免与 Apple clang 冲突
gcc-14 --version
g++-14 --version

# 查看安装路径
ls /opt/homebrew/bin/gcc-*   # Apple Silicon
ls /usr/local/bin/gcc-*      # Intel Mac

# 创建别名(可选)
echo 'alias gcc="gcc-14"' >> ~/.zshrc
echo 'alias g++="g++-14"' >> ~/.zshrc
source ~/.zshrc

macOS 上的注意事项

事项说明
gcc 命令默认指向 Apple Clang,需要使用 gcc-14
ABI 兼容Homebrew GCC 编译的代码与 Apple Clang 编译的代码可能在 C++ ABI 上不兼容
框架链接macOS 使用 Framework 概念,与 Linux 的 .so 不同
代码签名macOS 要求可执行文件有有效签名,否则可能被 Gatekeeper 阻止

2.3 Windows 上安装 GCC

方式一:MSYS2(推荐)

MSYS2 提供完整的类 Unix 环境和最新的 MinGW-w64 工具链。

# 1. 下载安装 MSYS2
# https://www.msys2.org/

# 2. 打开 MSYS2 UCRT64 终端,更新系统
pacman -Syu

# 3. 安装 MinGW-w64 GCC 工具链
pacman -S mingw-w64-ucrt-x86_64-gcc
pacman -S mingw-w64-ucrt-x86_64-cmake
pacman -S mingw-w64-ucrt-x86_64-make

# 4. 验证
gcc --version
g++ --version

# 5. 将 MinGW-w64 的 bin 目录添加到 PATH
# C:\msys64\ucrt64\bin

MSYS2 子系统对比

子系统前缀说明
MSYS/usrCygwin 兼容层,POSIX 仿真
UCRT64/ucrt64Universal CRT,推荐用于新项目
MINGW64/mingw64传统 MinGW-w64,原生 Windows API
CLANG64/clang64使用 Clang 的 MinGW-w64

方式二:MinGW-w64 直接安装

# 从 https://winlibs.com/ 下载预编译的 MinGW-w64
# 解压后将 bin 目录添加到系统 PATH

# 验证
gcc --version

方式三:WSL(Windows Subsystem for Linux)

# 在 PowerShell 中启用 WSL
wsl --install

# 进入 WSL 后按 Ubuntu 方式安装
sudo apt update
sudo apt install build-essential

# 验证
gcc --version

Windows 上三种方式对比

方式环境产出适用场景
MSYS2类 Unix 环境Windows 原生 EXE最推荐,工具链最新
MinGW-w64纯 WindowsWindows 原生 EXE无需 MSYS2 环境
WSL完整 LinuxLinux ELF学习 Linux 开发

2.4 交叉编译工具链

交叉编译(Cross Compilation)是指在一个平台上编译出在另一个平台上运行的代码。在嵌入式开发和多架构构建中极为常见。

安装交叉编译工具链

# Ubuntu/Debian - ARM 64-bit (aarch64)
sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu

# ARM 32-bit
sudo apt install gcc-arm-linux-gnueabihf g++-arm-linux-gnueabihf

# RISC-V 64-bit
sudo apt install gcc-riscv64-linux-gnu g++-riscv64-linux-gnu

# MIPS
sudo apt install gcc-mips-linux-gnu g++-mips-linux-gnu

# PowerPC 64-bit
sudo apt install gcc-powerpc64le-linux-gnu g++-powerpc64le-linux-gnu

# ARM Cortex-M(bare-metal / 嵌入式)
sudo apt install gcc-arm-none-eabi

# 验证
aarch64-linux-gnu-gcc --version

常见交叉编译目标

目标架构工具链前缀说明
ARM 64-bit (AArch64)aarch64-linux-gnu-树莓派 4/5 64-bit、服务器
ARM 32-bit (硬浮点)arm-linux-gnueabihf-树莓派 2/3 32-bit
ARM 32-bit (软浮点)arm-linux-gnueabi-嵌入式设备
RISC-V 64-bitriscv64-linux-gnu-RISC-V Linux
x86 32-bit (在 64-bit 主机)i686-linux-gnu-32-bit 兼容
MIPSmips-linux-gnu-路由器、嵌入式
PowerPC 64-bit LEpowerpc64le-linux-gnu-IBM POWER 服务器
ARM Cortex-M (bare-metal)arm-none-eabi-微控制器
AVRavr-Arduino
ESP32xtensa-esp32-elf-ESP32 系列

交叉编译示例

# 用 aarch64 工具链编译
aarch64-linux-gnu-gcc -o hello_arm64 hello.c

# 检查生成的文件格式
file hello_arm64
# hello_arm64: ELF 64-bit LSB executable, ARM aarch64 ...

# 在本机无法直接运行
./hello_arm64
# exec format error

# 需要在 ARM64 设备上运行或使用 QEMU 模拟
qemu-aarch64 hello_arm64

2.5 GCC 多版本共存

在实际开发中,经常需要在不同 GCC 版本之间切换——旧项目需要旧版本兼容性,新项目需要新特性支持。

使用 update-alternatives(Debian/Ubuntu)

# 安装多个版本
sudo apt install gcc-11 gcc-12 gcc-13 g++-11 g++-12 g++-13

# 注册各版本到 alternatives 系统
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-11 11
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-12 12
sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-13 13

sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-11 11
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-12 12
sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-13 13

# 交互式选择默认版本
sudo update-alternatives --config gcc

# 输出:
#   Selection    Path             Priority  Status
# ─────────────────────────────────────────────────
# * 0            /usr/bin/gcc-13   13        auto mode
#   1            /usr/bin/gcc-11   11        manual mode
#   2            /usr/bin/gcc-12   12        manual mode
#   3            /usr/bin/gcc-13   13        manual mode

使用环境变量切换

# 在 ~/.bashrc 或 ~/.zshrc 中定义版本切换函数
gcc_use() {
    local ver=$1
    if [ -z "$ver" ]; then
        echo "Usage: gcc_use <version>"
        echo "Available versions:"
        ls /usr/bin/gcc-* 2>/dev/null | grep -oP '\d+'
        return 1
    fi

    export CC="gcc-${ver}"
    export CXX="g++-${ver}"
    echo "Switched to GCC ${ver}"
    $CC --version | head -1
}

# 使用
gcc_use 13
gcc_use 12

使用 SCL(Fedora/RHEL/CentOS)

# 安装软件集合
sudo dnf install gcc-toolset-12 gcc-toolset-13

# 临时启用(仅当前 shell)
scl enable gcc-toolset-13 bash

# 验证
gcc --version

# 持久化(添加到 ~/.bashrc)
echo "source scl_source enable gcc-toolset-13" >> ~/.bashrc

手动编译安装特定版本

# 下载 GCC 源码
wget https://ftp.gnu.org/gnu/gcc/gcc-14.1.0/gcc-14.1.0.tar.xz
tar xf gcc-14.1.0.tar.xz
cd gcc-14.1.0

# 下载依赖(GMP、MPFR、MPC、ISL)
./contrib/download_prerequisites

# 配置(安装到 /opt/gcc-14,不影响系统版本)
mkdir build && cd build
../configure \
    --prefix=/opt/gcc-14 \
    --enable-languages=c,c++ \
    --disable-multilib \
    --enable-default-pie \
    --with-system-zlib

# 编译(需要较长时间,建议 -j 使用多核)
make -j$(nproc)

# 安装
sudo make install

# 添加到 PATH
export PATH=/opt/gcc-14/bin:$PATH
export LD_LIBRARY_PATH=/opt/gcc-14/lib64:$LD_LIBRARY_PATH

# 验证
gcc --version

手动编译时的 configure 选项

选项说明
--prefix=<dir>安装目录
--enable-languages=c,c++,fortran,...要编译的语言前端
--disable-multilib不编译 32-bit 支持
--enable-default-pie默认生成 PIE 可执行文件
--with-system-zlib使用系统的 zlib
--disable-bootstrap跳过自举编译(加速,但不验证编译器本身)
--enable-threads=posix使用 POSIX 线程
--with-arch=目标架构
--with-tune=调优目标 CPU

2.6 验证安装

基本验证脚本

#!/bin/bash
# verify_gcc.sh - 验证 GCC 安装状态

echo "=== GCC 版本 ==="
gcc --version | head -1

echo ""
echo "=== G++ 版本 ==="
g++ --version | head -1

echo ""
echo "=== 编译器路径 ==="
which gcc
which g++

echo ""
echo "=== 支持的语言 ==="
gcc -v -E -x c /dev/null 2>&1 | grep "configured with"

echo ""
echo "=== 默认标准 ==="
echo "C:   $(gcc -dM -E -x c /dev/null 2>/dev/null | grep __STDC_VERSION__)"
echo "C++: $(g++ -dM -E -x c++ /dev/null 2>/dev/null | grep __cplusplus)"

echo ""
echo "=== 测试编译 ==="
echo '#include <stdio.h>
int main() { printf("Hello GCC!\\n"); return 0; }' > /tmp/test_gcc.c
gcc -o /tmp/test_gcc /tmp/test_gcc.c && /tmp/test_gcc
rm -f /tmp/test_gcc /tmp/test_gcc.c

echo ""
echo "=== make ==="
make --version | head -1

echo ""
echo "=== GDB ==="
gdb --version 2>/dev/null | head -1 || echo "GDB 未安装"

输出示例:

=== GCC 版本 ===
gcc (Ubuntu 13.2.0-23ubuntu4) 13.2.0

=== G++ 版本 ===
g++ (Ubuntu 13.2.0-23ubuntu4) 13.2.0

=== 编译器路径 ===
/usr/bin/gcc
/usr/bin/g++

=== 支持的语言 ===
 --enable-languages=c,ada,c++,d,fortran,go,objc,obj-c++

=== 默认标准 ===
C:   #define __STDC_VERSION__ 201710L
C++: #define __cplusplus 201703L

=== 测试编译 ===
Hello GCC!

=== make ===
GNU Make 4.3

=== GDB ===
GNU gdb (Ubuntu 14.0.50.20230907-0ubuntu1) 14.0.50.20230907-git

要点回顾

要点核心内容
Linux 安装build-essential(Debian)/ Development Tools(RHEL)
macOS 安装Homebrew 安装 gcc,使用 gcc-14 命令
Windows 安装MSYS2 + MinGW-w64(推荐)或 WSL
交叉编译安装目标架构工具链,如 gcc-aarch64-linux-gnu
多版本共存update-alternatives(Debian)/ scl(RHEL)/ 手动编译

注意事项

系统依赖: 系统包(如 apt 安装的)通常会自动处理依赖关系,手动编译安装时需要注意 GMP、MPFR、MPC 等依赖库。

ABI 兼容性: 不同 GCC 大版本间的 C++ ABI 可能不兼容。GCC 5.1 引入了新的 libstdc++ ABI,旧 ABI 代码(_GLIBCXX_USE_CXX11_ABI=0)和新 ABI 代码不能在同一程序中混用。

交叉编译 sysroot: 交叉编译时需要目标平台的头文件和库(sysroot),否则会报头文件找不到错误。

Windows PATH: MSYS2 中有多个 bin 目录(/usr/bin/ucrt64/bin 等),确保将正确的路径添加到 Windows PATH。


扩展阅读


下一步

03 - 编译基础流程:深入理解 GCC 的四阶段编译流程——预处理、编译、汇编、链接。