【Linux】gcc/g++ 编译:从源码到可执行文件的四个阶段

学会了写代码,接下来就是把它变成能跑的程序。gcc/g++ 是 Linux 下 C/C++ 的事实标准编译器。表面上一条命令就完成了编译,但背后经历了四个阶段:预处理 → 编译 → 汇编 → 链接

目录

[1. 四个阶段逐个看](#1. 四个阶段逐个看)

[2. 动态链接 vs 静态链接](#2. 动态链接 vs 静态链接)

[3. 其他常用选项](#3. 其他常用选项)


1. 四个阶段逐个看

用一个最简单的 hello.c 为例:

c

复制代码
#include <stdio.h>
int main() {
    printf("hello world\n");
    return 0;
}

阶段一:预处理(Preprocessing)

处理 #include 头文件展开、#define 宏替换、#if 条件编译、去除注释等。

bash

复制代码
gcc -E hello.c -o hello.i

-E 表示只做预处理。输出文件 hello.i 是展开后的纯 C 代码,通常很大,因为 stdio.h 连带的所有头文件都被展开进来了。

阶段二:编译(Compilation)

把预处理后的代码翻译成汇编语言。这一步会检查语法错误。

bash

复制代码
gcc -S hello.i -o hello.s

-S 表示生成汇编代码。输出文件 hello.s 是汇编源码,你可以打开看看 C 代码对应的汇编指令长什么样。

阶段三:汇编(Assembly)

把汇编代码转换成机器指令,生成二进制目标文件。

bash

复制代码
gcc -c hello.s -o hello.o

-c 表示编译到目标文件。输出文件 hello.o 是二进制格式,不能直接执行。

阶段四:链接(Linking)

把多个目标文件和库链接在一起,生成可执行文件。

bash

复制代码
gcc hello.o -o hello

-o 指定输出文件名,最终生成的可执行文件 hello 可以直接运行。

平时我们直接 gcc hello.c -o hello,编译器内部就是按顺序走了这四个阶段。

2. 动态链接 vs 静态链接

链接阶段有一个很重要的选择:用动态库还是静态库?

静态链接:把库的代码在编译时"复制"到可执行文件中。生成的程序比较大,但运行时不需要依赖外部库文件。

动态链接 :编译时只记录"我需要 libc.so.6 里的 printf",实际调用发生在程序运行时。可以说,动态链接就是把链接这个动作推迟到了运行时刻。

动态链接是 Linux 下 gcc 的默认行为。这样做的好处:

  • 多个程序共享同一个库文件,内存中只有一份副本。

  • 库升级后,所有依赖它的程序自动使用新版本,不用重新编译。

ldd 命令可以查看一个程序依赖哪些动态库:

bash

复制代码
ldd hello
# libc.so.6 => /lib64/libc.so.6

静态库的后缀是 .a,动态库后缀是 .so(对应 Windows 上的 .lib.dll)。在云服务器上,C/C++ 静态库通常没有预装,需要的话:

bash

复制代码
# CentOS
yum install glibc-static libstdc++-static -y

3. 其他常用选项

bash

复制代码
-g          # 生成调试信息,配合 gdb 使用
-O0 ~ -O3   # 优化级别,O0 无优化,O3 最高
-Wall       # 打开所有警告
-w          # 关闭所有警告
-static     # 强制静态链接
  • 开发阶段用 -g,调试信息是 gdb 工作的前提。

  • 发布阶段用 -O2-O3,编译器的优化有时能带来显著的性能提升。

  • -Wall 建议养成习惯,警告往往暴露潜在的逻辑问题。

相关推荐
爱喝水的鱼丶9 分钟前
SAP-ABAP:ABAP 用户出口参数传递与上下文获取:SAP 标准数据读取与交互逻辑实现
运维·性能优化·交互·sap·abap·经验交流·出口
IT大白鼠10 分钟前
PentestGPT作为AI运维编排工作流自动化底座的技术架构与应用价值评估
运维·人工智能·自动化·pentestgpt
M78佐菲21 分钟前
c语言学习笔记:排序与查找方法整理
linux·c语言·笔记·学习·算法
ltl1 小时前
QUIC 协议拆解(上):为什么 TCP 改不动了
linux
j7~1 小时前
【Git】《Git 系列指南(二):Git基本操作与 reset 三种模式》
运维·git·git安装·git基本操作·git配置·创建git仓库·git reset三种模式
zzzll11111 小时前
n8n 工作流自动化平台入门指南
运维·自动化
Hrain-AI1 小时前
Anthropic oncall-kit 开源拆解:运维 Agent 落地范式的四基石与权限边界
运维·人工智能·开源
HXDGCL2 小时前
从“转盘困局”到“直线破局”:华创力科技PTS精密分度输送系统如何重塑自动化产线
运维·科技·自动化
戴西软件2 小时前
国内有哪些智能化RPA工具?——从“录数据”到“做判断”,国产数字员工正在重新定义自动化
运维·自动化·rpa
Linux-lucky2 小时前
28-Linux学习之旅之Maven与Nexus制品库
linux·运维·学习·nginx·tomcat·maven