GCC 完全指南 / 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 | /usr | Cygwin 兼容层,POSIX 仿真 |
| UCRT64 | /ucrt64 | Universal 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 | 纯 Windows | Windows 原生 EXE | 无需 MSYS2 环境 |
| WSL | 完整 Linux | Linux 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-bit | riscv64-linux-gnu- | RISC-V Linux |
| x86 32-bit (在 64-bit 主机) | i686-linux-gnu- | 32-bit 兼容 |
| MIPS | mips-linux-gnu- | 路由器、嵌入式 |
| PowerPC 64-bit LE | powerpc64le-linux-gnu- | IBM POWER 服务器 |
| ARM Cortex-M (bare-metal) | arm-none-eabi- | 微控制器 |
| AVR | avr- | Arduino |
| ESP32 | xtensa-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。
扩展阅读
- GCC 安装说明 — 官方安装指南
- MSYS2 官网 — Windows 上的最佳 GCC 环境
- Ubuntu Toolchain PPA — 最新 GCC 版本
- Bootlin 工具链 — 预编译的交叉编译工具链
- crosstool-NG — 自定义交叉编译工具链构建工具
- Linaro 工具链 — ARM 架构优化工具链
下一步
→ 03 - 编译基础流程:深入理解 GCC 的四阶段编译流程——预处理、编译、汇编、链接。