GCC编译四步揭秘:从源码到可执行文件
目录一、GCC C语言编译器1.1 阶段1预处理​编辑1.2 阶段 2编译Compilation1.3 阶段 3汇编Assembly1.4 阶段 4链接Linking二、GCC核心功能2.1 条件翻译(仅了解)2.2 静态链接 和 动态链接2.3 查看依赖的库文件GCC将C源码编译为可执行文件经历预处理展开头文件、宏替换、条件编译、编译生成汇编代码、汇编生成目标文件.o和链接合并目标文件与库生成可执行程序四阶段。支持静态链接代码复制到可执行文件独立运行但体积大和动态链接运行时加载库节省空间但依赖系统库。通过ldd可查看动态依赖库-E、-S、-c等选项分别控制预处理、编译、汇编阶段输出。一、GCC C语言编译器编译过程的本质将源文件翻译成可执行二进制文件。1.1 阶段1预处理文件后缀.i处理以#开头的预处理指令#include把头文件内容直接复制粘贴进当前源码#define宏替换把代码里宏名全部替换成对应文本#ifdef / #endif条件编译保留 / 删除指定代码段删除注释// 单行注释、/* */ 多行注释全部清除添加行号信息方便后续报错定位gcc -E test.c -o test.i首先创建code.c并输入如下内容1 #includestdio.h 2 3 #define M 100 4 int main() 5 { 6 printf(hello %d\n,M); 7 //printf(hello %d\n,M); 8 //printf(hello %d\n,M); 9 //printf(hello %d\n,M); 10 //printf(hello %d\n,M); 11 //printf(hello %d\n,M); 12 printf(hello %d\n,M); 13 }如果直接编译将看不到翻译过程[kkkVM-0-4-centos ~]$ gcc code.c -o code.exe //-o 明确新文件的名称 [kkkVM-0-4-centos ~]$ ll total 36 -rwxrwxr-x 1 kkk kkk 8360 Oct 6 21:37 a.out -rw-rw-r-- 1 kkk kkk 309 Oct 6 21:37 code.c -rwxrwxr-x 1 kkk kkk 8360 Oct 6 21:39 code.exe -rw-rw-r-- 1 kkk kkk 827 Oct 6 21:08 install.sh -rw-rw-r-- 1 kkk kkk 47 Oct 6 21:14 test.c预处理指令gcc -E code.c -o code.i将翻译过程放到code.i的临时文件中-E表示预处理后停下-o后跟预处理的结果预处理的工作头文件展开、去注释、宏替换、条件编译如图预处理后的文件非常长头文件展开就是把头文件相关内容拷贝到源文件头源合并的过程编译器只需要再预处理时需要头文件1.2 阶段 2编译Compilation文件后缀.s把预处理后的.i文件翻译成汇编代码汇编语言文本人可读但还不能直接运行gcc -S test.i -o test.s-S执行到编译阶段输出汇编.s文件1.3 阶段 3汇编Assembly文件后缀.o目标文件.o: .obj可重定位二进制目标文件汇编器 as将汇编代码翻译成机器码二进制目标文件已经是二进制但缺少函数地址链接不能直接运行gcc -c test.s -o test.o-c执行到汇编输出目标文件.o1.4 阶段 4链接Linking输出可执行文件无后缀Linux 下将多个.o目标文件 系统库文件libc合并解析符号、补齐函数地址比如printf在 C 标准库里面生成最终可以直接执行的程序日常开发中GCC会直接一键完成这四个阶段ESc - iso二、GCC核心功能2.1 条件翻译(仅了解)属于预处理阶段的内容gcc -E 的时候就生效编译前就决定哪些代码保留、哪些直接删掉核心语法#ifdef 宏名 // 如果宏已经被定义保留这段代码 #else // 宏没定义保留这段 #endif#ifndef 宏名 // 如果宏【没有】被定义保留这段 #else // 宏已经定义 #endif#ifndef 最常见用途头文件防止重复包含头文件保护宏简单例子#include stdio.h #define DEBUG 1 #ifdef DEBUG printf(调试信息进入函数\n); #endif int main(){ printf(hello\n); return 0; }2.2 静态链接 和 动态链接链接是编译四步的最后一步把.o目标文件 库 合并生成可执行程序。库分为两种静态库.a、动态库.soLinux 下静态链接静态库 .a原理链接的时候把库里面用到的代码直接复制拷贝到你的可执行文件内部。 程序生成后不再依赖原静态库文件。gcc test.c -o test_static -static #强制静态链接生成可执行文件(因为GCC默认是动态链接的)安装命令sudo yum install glibc-static libstdc-static -y优点可执行文件不依赖系统库移植性强。缺点会让可执行程序变大运行的时候加载到内存占据更多的内存空间浪费资源动态链接动态共享库 .so原理链接阶段不拷贝库代码只记录库名和符号。 等到程序运行的时候操作系统再把动态库加载到内存多个程序可以共享同一份内存里的库。Linux 默认 gcc 就是动态链接gcc test.c -o test_dynamic优点文件体积小库文件被多个程序共享节省内存和磁盘空间缺点依赖系统中对应的库文件一旦库文件缺失所有程序都无法运行了。2.3 查看依赖的库文件# 查看程序依赖哪些动态库动态链接专用 ldd test_dyn # 静态编译出来的程序ldd会提示不是动态可执行文件 ldd test_static以上就是本期的全部内容感谢你能够看到这里

相关新闻

前端八股: var、let、const 的区别

前端八股: var、let、const 的区别

在 JavaScript 中,var、let、const 都可以声明变量,但它们在作用域、变量提升、重复声明、修改值等方面有明显区别。先看一个总表:特性varletconst作用域函数作用域块级作用域块级作用域变量提升有,可提前访问,值是 un…

2026/10/7 15:31:47 阅读更多 →
Steam秋季促销倒计时,RTX50系高刷游戏本盘点:50系同价位选购指南

Steam秋季促销倒计时,RTX50系高刷游戏本盘点:50系同价位选购指南

一、活动背景Steam秋季促销从10月2日凌晨1点持续到10月9日凌晨1点,正好覆盖整个国庆假期期间3A开放世界、FPS竞技、RPG冒险等全品类基本都会触达年度史低,部分热门大作折扣力度甚至超过夏促二、五款推荐机型1.华硕天选7Pro酷睿版配置:酷睿Ult…

2026/10/7 15:31:47 阅读更多 →
《创业之路》-1017-细读商业经典 - 长期主义的内涵

《创业之路》-1017-细读商业经典 - 长期主义的内涵

长期主义是商业世界被谈论最多,也被误解最多的概念之一。很多人把它等同于 “坚持”“熬时间”“十年磨一剑”,但翻遍《基业长青》《德鲁克论管理》以及贝佐斯的股东信就会发现:长期主义从来不是意志层面的 “死磕”,而是一套穿越…

2026/10/7 15:31:47 阅读更多 →

最新新闻

C# WinForm纯托管图像处理库:高斯/中值/小波滤波实战

C# WinForm纯托管图像处理库:高斯/中值/小波滤波实战

简介:本资源是一套面向C# WinForm开发者与图像处理初学者的实战型代码包,聚焦图形处理核心能力训练,涵盖图像加载显示、灰度转换、高斯/均值/中值滤波去噪及小波分析等关键技术点,适用于UI增强、数据分析前端或课程设计等实际场景…

2026/10/7 16:37:16 阅读更多 →
仿720云krpano全景制作源码拆解:支付、打赏与场景红包实现

仿720云krpano全景制作源码拆解:支付、打赏与场景红包实现

简介:这套基于krpano框架的仿720云全景制作网站最新版源码,面向需要搭建全景展示与商业化平台的开发人员,适用于房地产、旅游、展览等行业的全景项目。资源共1982个文件,含659个php后端代码、492个png图片素材、162个js脚本、103个…

2026/10/7 16:37:16 阅读更多 →
松翰UVC TestAP:从H.264调试到产测自动化的完整指南

松翰UVC TestAP:从H.264调试到产测自动化的完整指南

简介:SONiX UVC摄像头驱动测试程序源码包r1.0.21,面向嵌入式驱动开发者和摄像头模组测试人员,核心用途是验证SONiX摄像头在UVC协议下的H.264硬编码功能是否正常,帮助定位驱动与硬件之间的兼容性问题。H.264硬编码依赖摄像头内置编…

2026/10/7 16:37:15 阅读更多 →
GD32H759 OSPI驱动Flash实战:XIP+RT-Thread FAL+LittleFS工业级应用

GD32H759 OSPI驱动Flash实战:XIP+RT-Thread FAL+LittleFS工业级应用

1. 项目概述:为什么在GD32H759上用OSPI驱动Flash不是“炫技”,而是工控现场的刚需你手头有一块GD32H759开发板,主频高达550MHz,带双核Cortex-M33,片上RAM有2MB,但Flash只有2MB——这在跑RT-ThreadGUI通信协…

2026/10/7 16:37:15 阅读更多 →
商用热泵COP实时计算链路:Modbus采集、MQTT传输与时序库落地实践

商用热泵COP实时计算链路:Modbus采集、MQTT传输与时序库落地实践

商用热泵的COP计算,我见过太多项目栽在同一个坑里:验收时拿个便携仪表测半小时,数据漂亮得不行,结果甲方自己跑一个采暖季,电费单一出来,实际能效比标称低了30%以上。问题出在哪?不是机组不行&a…

2026/10/7 16:37:15 阅读更多 →
域名防红跳转源码拆解:域名池、随机跳转与防屏蔽实战

域名防红跳转源码拆解:域名池、随机跳转与防屏蔽实战

简介:一套带后台的域名防红跳转源码,适用于网络推广与落地页运营人员,通过两次随机跳转机制降低推广域名被平台屏蔽的风险。源码支持添加多个中转域名与跳转显示域名,当某一域名被屏蔽时,随机规则仍有机会让用户跳转至…

2026/10/7 16:36:14 阅读更多 →

日新闻

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

ROS2机械臂仿真与运动控制:从URDF建模到Gazebo实战全解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:01:58 阅读更多 →
用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

用浏览器直接改ESP32的WiFi密码:NVS键值配置工具设计与实现

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →
芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

芯片封装缺陷检测:扫描声学显微镜(SAT)原理与实操指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 1:02:00 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:34:12 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:34:13 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 9:29:10 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 14:34:12 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 11:43:46 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/7 13:34:55 阅读更多 →