需安装完整gcc套件:ubuntu/debian执行sudo apt install build-essential,rhel/centos/fedora执行sudo dnf/yum groupinstall "development tools",arch系执行sudo pacman -s gcc;安装后必须同时验证gcc --version和g++ --version输出有效版本号。

GCC 和 g++ 不是“插件”,而是独立的系统级命令行编译器。Linux 下不存在所谓“安装 GCC 插件”的操作——你实际要做的,是安装完整的 GCC 编译器套件,并确保 g++ 可用。
确认系统是否真没装 GCC/G++
别只看 gcc --version 有无输出:g++ 可能单独缺失。直接运行:
gcc --version && g++ --version
只要任一命令报 command not found,就说明对应组件没装。常见情况是:gcc 存在但 g++ 缺失(尤其在最小化安装的 CentOS/RHEL 镜像里)。
-
gcc单独安装(如sudo apt install gcc)不带 C++ 支持,g++不会自动出现 -
build-essential(Ubuntu/Debian)或"Development Tools"(RHEL/CentOS/Fedora)才是完整工具链,含g++、make、头文件和标准库 -
which g++返回空,不是 PATH 问题,是压根没装
按发行版装对包,别只装 gcc
不同发行版的包名和依赖逻辑完全不同,混用命令会失败。必须先确认发行版:
cat /etc/os-release | grep -E "^(ID|ID_LIKE)=\""
然后执行对应命令:
- ID="ubuntu" 或 ID_LIKE="debian" →
sudo apt update && sudo apt install build-essential - ID="centos"、ID="rhel"、ID="fedora" 或 ID_LIKE="fedora" →
sudo dnf groupinstall "Development Tools"(CentOS 8+/RHEL 8+)或sudo yum groupinstall "Development Tools"(CentOS 7/RHEL 7) - ID="arch" 或 ID="manjaro" →
sudo pacman -S gcc(已默认包含g++)
注意:build-essential 在 Ubuntu 中是元包,gcc-c++ 是 RHEL 系的子包名;单独装 gcc-c++(如 sudo dnf install gcc-c++)可行,但缺 make 或头文件时仍会编译失败。
验证 g++ 能不能真正编译 C++ 代码
装完别只信 g++ --version。写个最简测试:
echo '#include <iostream>\nint main(){std::cout test.cpp && g++ test.cpp -o test && ./test</iostream>
如果报错:
-
fatal error: iostream: No such file or directory→ 头文件缺失,libc6-dev(Debian/Ubuntu)或glibc-devel(RHEL/CentOS)没装全 -
undefined reference to `std::cout'→ 用了gcc编译.cpp文件,或链接时没走g++;C++ 必须用g++链接,它才自动加-lstdc++ -
Segmentation fault运行时报错 → 很可能是混用了gcc编译 +gcc链接,没链接 C++ 标准库
源码编译只在必要时才做
除非你需要 GCC 12+ 的 C++20 特性,而系统仓库只有 GCC 4.8(如 CentOS 7 默认),否则别碰源码编译。它耗时长、依赖多、容易卡在 configure 阶段。
真要编译,关键点只有三个:
- 先装齐依赖:
gawk、bison、flex、texinfo、zlib-devel、mpfr-devel、gmp-devel、libmpc-devel(RHEL 系)或zlib1g-dev、libmpc-dev等(Debian 系) - 进源码目录后,必须运行
./contrib/download_prerequisites,否则configure会因缺 GMP/MPFR/MPC 失败 -
../configure时至少加--enable-languages=c,c++,否则g++不会被构建
装完记得把 --prefix 路径加进 $PATH,且确保旧版本 /usr/bin/g++ 不再优先被调用——否则你以为在用新版本,实际还是老的。











