ARTICLE DETAIL

资讯详情

深耕网站建设、视觉设计与SEO优化的一线实战洞察。

萌新学习编译安装GCC(C/C++编译器)项目

萌新学习编译安装GCC(C/C++编译器)项目 本文经验大部分来自ds小部分来自自己的想法。欢迎各位大佬rape me。只针对c/c语言编译器的编译安装。本文适用于Ubuntu系统其他系统请靠AI举一反三。不想看废话直接冲标题五一、为什么要编译安装GCC平常linux如Ubuntu的官方GCC不是c编译器是GCC项目版本过低自己想捣鼓高版本的GCC不是c编译器是GCC项目因此就需要编译安装高版本的GCC不是c编译器是GCC项目举个极端的例子你不能指望Ubuntu22.04的官方GCC不是c编译器是GCC项目可以写C23C26吧二、事前准备1.安装编译工具包必须先有鸡才有蛋当然第一只鸡当然是纸条带的机器指令啦~~工具包括gccc编译器gmakelibc6-devC 标准库和头文件dpkg-dev将编译好的软件整理成安装包等。还有GMPMPFRMPC库如果没有也自行从官方库下载或者自己动手编译安装一个。以及GCC不是c编译器是GCC项目源代码这个去镜像源拿一个哪个版本随你挑选建议拿比系统版本高的版本。贴一个16.2版本的GCC嘻嘻-2026.9.23wget https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-16.2.0/gcc-16.2.0.tar.xz2.安装Python3用来跑编译脚本的小弟我也看不懂这种脚本。。。3.其他库包括数学库二进制工具C标准库开发运行时库安全加密库压缩库终端界面库可选的高级库等这些不用管瞎安装就是了。3.综合libstdc-dev在ubuntu22中有好几个版本我选择了libstdc-12-dev。2026.9.23sudo apt update sudo apt install build-essential python3 libc6-dev binutils \ libgmp-dev libmpfr-dev libmpc-dev \ libstdc-12-dev libgcc-s1 \ zlib1g-dev libssl-dev libncurses5-dev pkg-config或者跑去你下载的GCC目录下执行安全靠谱但是可能速度贼慢因为防火墙大佬可以自己改这个文件或者魔法吧./contrib/download_prerequisites三、编译环节1.GCC包括什么语言语言参数值状态Cc核心支持Cc核心支持Objective-Cobjc支持Objective-Cobj-c支持Fortranfortran支持Gogo支持Dd支持Adaada支持Modula-2m2支持RustrustGCC 16 新增COBOLcobolGCC 16 新增Java (gcj)-GCC 7 已移除Python-不支持但编译依赖 Python 32.configure指令configure是自动化生成make文件的需要输入相应的参数才能生成相应的make文件make文件决定你怎么编译GCC把GCC放在哪里。首先指定只编译c和c编译器其他编译器用不上--enable-languagesc,c如果想当M可以启动编译所有语言处理器不过是另外的话题了毕竟其他语言处理器也需要先有鸡再有蛋--enable-languagesall然后指定编译后文件放在哪里一般放在/usr/local那里建议先实现创建好该文件夹--prefix/usr/local/gcc2再者是否使用系统官方自带zlib库--with-system-zlib接着是否启用并行链接器cc编译过程分预处理编译汇编和链接四个步骤这四者皆可并行执行有些GCC没有ld.gold链接器因此此项不能用需要自己看看。当然现代链接器已经够用不需要这项。先说ld.gold的缺点二进制体积大优点链接时快一点点。然后据说gnu社区已经把它弃用了悲~。2026.9.23参数作用-fuse-ldgold核心开关强制 GCC 调用ld.gold-fltoauto开启 LTOauto模式自动使用多线程LDFLAGS-fltoauto -fuse-ldgold最后优化--enable-lto启用链接时优化框架支持--disable-multilib取消32位GCC的支持懒得支持了2026.9.23查看帮助./configure --help综合./configure \ --prefix/usr/local/gcc2 \ --enable-languagesc,c \ --enable-lto \ --disable-multilib3.在源代码文件夹里面创建build文件夹mkdir build cd build然后../configure \--prefix/usr/local/gcc2 \--enable-languagesc,c \--enable-lto \--disable-multilib这样所有杂七杂八的东西就会生成在build文件夹里面了而不是跟源代码杂居。。。4.启用make编译make -j$(nproc)这个会自动识别你电脑最大的CPU核心数然后全员动员并行编译或者使用ninja优势在于增量编译初次编译差别不大make ninja -j$(nproc)编译好后sudo make install就可以在/usr/local/gcc2看见所有GCC程序啦。5.添加系统变量关键个人建议添加gccg等编译器所在的文件夹目录以及他们的头文件所在的文件夹目录即可。添加环境变量这个东西相信各位大佬都是会的。当然与原有GCC是GCC项目不是编译器发生冲突咋办a.改名有点抽象的做法b.软连接相信各位冠希哥也会小弟我不献丑了c.将自己编译的GCC环境变量优先于系统GCC小弟我选择的方案6.验证gcc --version四、其他1.在Windows上使用mingw-w64一般使用预编译好的文件就可以直接使用Windows版本的GCC了不需要编译安装在这个操作系统编译安装属于小众行为。2.交叉编译GCC只需要改变编译器后端选项就可交叉编译比如你在x86架构上交叉编译出生成arm架构代码的GCC这个GCC可以跑在x86架构上但是却生成arm架构的可执行程序。3.分布式编译安装使用distcc。你可能会想使用物理机的多个虚拟机分布式编译安装是否可行答案是不如一个物理机的一个虚拟机编译安装比如wsl2vmware等或者物理机自己就是Linux使用物理机自己就行。具体原理小弟我不知道但是男人的第六感你懂的。4.mingw-w64跟GCC的差异a. Linux 与 Windows 的差异系统异常模型特点LinuxDWARF统一零运行时开销依赖系统运行时库WindowsDWARF-2 / SJLJ / SEH可选多种模型可选由 MinGW-w64 提供b. Windows 上三种模型对比模型工作原理优点缺点DWARF-2 (DW2)使用 DWARF 格式的栈展开信息零运行时开销性能好不支持 Windows SEH无法捕获硬件异常SJLJ通过setjmp/longjmp模拟异常跨平台性好任何环境都能工作运行时开销大每次进入try块都有成本SEH直接使用 Windows 原生异常机制与 Windows 深度集成能捕获硬件异常性能稍差为什么会这样Linux 内核和 C 运行时完全信赖 DWARF 标准Windows 内核有自己原生的 SEH 机制GCC 作为外来者提供多种方式来适配或绕过这种差异MinGW-w64 默认使用 DWARF-2但对 SEH 的支持也越来越完善5.为什么编译GCC时shell会出现警告不用管大概率是你的环境跟开发GCC的大佬的环境不一样或者编译器版本问题6.硬件加速硬件效果SSD/NVMe减少 I/O 等待可节省 30-50% 时间更多内存避免 swap建议 16GB更多 CPU 核心放大-j并行效果7.自定义GCC自己改写GCC这时需要用到增量编译ninja就非常好用了或者使用ccache。这是大佬做的事小弟我做不到。8.GCC也分前后端a.后端代码在哪里位于gcc/config/目录下按架构分子目录架构目录路径x86/x86-64gcc/config/i386/ARMgcc/config/arm/AArch64gcc/config/aarch64/RISC-Vgcc/config/riscv/PowerPCgcc/config/rs6000/LoongArchgcc/config/loongarch/b.后端包含哪些文件文件类型示例作用机器描述文件riscv.md指令模式定义后端核心C语言头文件riscv.h宏定义如TARGET_CPU_CPP_BUILTINS()C语言源文件riscv.c后端函数实现如参数传递规则目标选项文件riscv.opt架构特有命令行选项如-marchrv64gc机器模式定义riscv-modes.def特殊机器模式如条件码Makefile片段t-riscv该后端特定的构建规则c.后端是预编译好的吗不是预编译的。后端以源码形式存在于 GCC 源码包中编译时根据--target参数按需选取对应架构的后端源码被选中的后端源码会与前端、中端代码一起静态链接到最终的cc1、cc1plus等编译器可执行文件中d.前端代码在哪里GCC 源码中每个支持的语言都有一个对应的前端子目录位于gcc/下语言前端目录核心文件Cgcc/c/c-parser.c,c-decl.c,c-typeck.cCgcc/cp/parser.c,decl.c,pt.c模板处理Fortrangcc/fortran/parse.c,resolve.cGogcc/go/go-frontend/Dgcc/d/d-frontend.ccRust(GCC 16新增)gcc/rust/rust-parse.ccAdagcc/ada/par_sco.adbModula-2gcc/m2/m2-parse.cce.前后端大概了解源代码 (C/C/Rust/...) ↓ ┌──────────────┐ │ 前端 │ ← 词法分析、语法分析、语义分析 │ (Frontend) │ 输入: 源代码 (.c, .cpp, .rs) └──────────────┘ 输出: GENERIC / GIMPLE (中间表示) ↓ ┌──────────────┐ │ 中端 │ ← 机器无关优化 (内联、常量传播、死代码消除等) │ (Middle) │ 输入: GENERIC / GIMPLE └──────────────┘ 输出: GIMPLE / RTL ↓ ┌──────────────┐ │ 后端 │ ← 指令选择、寄存器分配、指令调度 │ (Backend) │ 输入: RTL └──────────────┘ 输出: 汇编代码 / 机器码 ↓ 可执行文件新增一门语言时开发者只需要写一个新的前端中端和后端完全不用改支持一个新架构时只需要写一个新的后端所有语言的前端都能受益五、速成基础指令仅Ubuntu# 安装库 sudo apt update sudo apt install -y build-essential python3 libgmp-dev libmpfr-dev libmpc-dev \ binutils libc6-dev zlib1g-dev libssl-dev pkg-config # 设置版本号根据需要修改 GCC_VERSION14.2.0 # 下载源码建议使用镜像源 # wget https://ftp.gnu.org/gnu/gcc/gcc-${GCC_VERSION}/gcc-${GCC_VERSION}.tar.gz wget / https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-${GCC_VERSION}/gcc-${GCC_VERSION}.tar.gz # 解压 tar -xzf gcc-${GCC_VERSION}.tar.gz # 进入源码目录 cd gcc-${GCC_VERSION} # 自动下载 GMP、MPFR、MPC 等依赖如未通过包管理器安装 ./contrib/download_prerequisites # 创建临时构建目录build mkdir build cd build # 构建prefix目录 sudo mkdir /usr/local/gcc2 # 配置加速版ld.gold ../configure \ --prefix/usr/local/gcc2 \ --enable-languagesc,c \ --enable-lto \ --disable-multilib # 并行编译使用所有 CPU 核心 make -j$(nproc) # 安装到 --prefix 指定的目录 sudo make install # 将新 GCC 加入 PATH永久生效 echo export PATH/usr/local/gcc2/bin:$PATH ~/.bashrc # 使配置立即生效 source ~/.bashrc # 查看版本 gcc --version g --version # 查看路径 which gcc # 查看链接器如使用了 ld.gold ldd $(which gcc) | grep gold # 删除源码和构建目录节省空间 cd ../.. rm -rf gcc-${GCC_VERSION} gcc-${GCC_VERSION}.tar.gz一键脚本仅Ubuntu#!/bin/bash # compile_gcc.sh - 一键编译安装 GCC set -e # 遇到错误立即退出 # 配置参数 GCC_VERSION14.2.0 PREFIX/usr/local/gcc2 JOBS$(nproc) # 1. 安装依赖 sudo apt update sudo apt install -y build-essential python3 libgmp-dev libmpfr-dev libmpc-dev \ binutils libc6-dev zlib1g-dev libssl-dev pkg-config # 2. 下载源码 wget / https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-${GCC_VERSION}/gcc-${GCC_VERSION}.tar.gz tar -xzf gcc-${GCC_VERSION}.tar.gz cd gcc-${GCC_VERSION} # 3. 下载依赖不必 # ./contrib/download_prerequisites # 4. 配置 mkdir build cd build sudo mkdir /usr/local/gcc2 ../configure \ --prefix${PREFIX} \ --enable-languagesc,c \ --enable-lto \ --disable-multilib # 5. 编译 make -j${JOBS} # 6. 安装 sudo make install # 7. 配置环境 echo export PATH${PREFIX}/bin:\$PATH ~/.bashrc source ~/.bashrc # 8. 验证 gcc --version g --version echo GCC ${GCC_VERSION} 安装完成
返回列表