【C语言】拆解C语言的编译过程
前言
学习C语言的过程中,涉及到各种各样的关键词,在我们点击编译的时候,都会做什么呢?让我们来拆解一下
C语言的编译过程
C语言的编译过程包括预处理、编译、汇编和链接四个主要步骤。每个步骤都有其特定的任务和输出文件类型,通过这些步骤,源代码被逐步转换为可执行的机器码。

预处理
预处理器处理源代码中的预处理指令:
- 预处理器处理源代码文件中的预处理指令,如
#include、#define等。 #include指令会将指定的头文件内容插入到源文件中。#define指令会进行宏替换。- 处理所有条件编译指令(
#ifdef、#ifndef、#endif等)。 - 预处理后的代码通常会生成一个扩展名通常为
.i的文件。 - 删除所有注释
- 添加行号和文件名标识,便于在调试和出错时给出具体代码位置
编译
- 编译器将预处理后的代码转换为汇编代码。
- 这个阶段会进行语法分析、语义分析、优化等操作。
- 确定变量的类型,作用域及储存位置。
- 生成的汇编代码通常保存在一个扩展名为
.s的文件中。
汇编
- 汇编器将汇编代码转换为机器码,即目标代码。
- 确定局部变量的内存。
- 生成的目标代码通常保存在一个扩展名为
.o或.obj的文件中。
链接
- 链接器将多个目标文件和库文件链接在一起,生成最终的可执行的二进制文件。
- 链接过程中,链接器会解决符号引用,确保所有函数和变量都能正确调用。
- 生成的可执行文件在Windows上通常扩展名为
.exe,在Unix/Linux系统上没有特定的扩展名。
举例
假设有一个C语言源文件main.c,其内容如下:
#include <stdio.h>int main() {printf("Hello, World!\n");return 0;
}
1. 预处理
使用gcc编译器的预处理命令:
gcc -E main.c -o main.i
生成的main.i文件内容可能如下:
# 1 "main.c"
# 1 "<built-in>"
# 1 "<command-line>"
# 1 "main.c"# 1 "/usr/include/stdio.h" 1 3 4
...
# 2 "main.c" 2int main() {printf("Hello, World!\n");return 0;
}
2. 编译
使用gcc编译器的编译命令:
gcc -S main.i -o main.s
生成的main.s文件内容可能如下:
.file "main.c".section .rodata
.LC0:.string "Hello, World!".text.globl main.type main, @function
main:
.LFB0:.cfi_startprocpushq %rbp.cfi_def_cfa_offset 16.cfi_offset 6, -16movq %rsp, %rbp.cfi_def_cfa_register 6subq $16, %rspmovl $.LC0, %edicall putsmovl $0, %eaxleave.cfi_def_cfa 7, 8ret.cfi_endproc
.LFE0:.size main, .-main.ident "GCC: (Ubuntu 9.3.0-17ubuntu1~20.04) 9.3.0".section .note.GNU-stack,"",@progbits
使用gcc编译器的汇编命令:
3. 汇编
使用gcc编译器的汇编命令:
gcc -c main.s -o main.o
生成的main.o文件是二进制格式的目标文件。
4. 链接
使用gcc编译器的链接命令:
gcc main.o -o main
生成的main文件是最终的可执行二进制文件。
总结
C语言的编译过程包括预处理、编译、汇编和链接四个主要步骤。每个步骤都有其特定的任务和输出文件类型,通过这些步骤,源代码被逐步转换为可执行的机器码。
相关文章:
【C语言】拆解C语言的编译过程
前言 学习C语言的过程中,涉及到各种各样的关键词,在我们点击编译的时候,都会做什么呢?让我们来拆解一下 C语言的编译过程 C语言的编译过程包括预处理、编译、汇编和链接四个主要步骤。每个步骤都有其特定的任务和输出文件类型&am…...
【C++】青蛙跳跃问题解析与解法
博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述第一部分:基本青蛙过河问题第二部分:石柱和荷叶问题 💯解题思路与分析第一部分:青蛙过河问题解法思路:递…...
自动驾驶AVM环视算法--python版本的俯视TOP投影模式
c语言版本和算法原理的可以查看本人的其他文档。《自动驾驶AVM环视算法--全景的俯视图像和原图》本文档进用于展示部分代码的视线,获取方式网盘自行获取(非免费介意勿下载):链接: https://pan.baidu.com/s/1MJa8ZCEfNyLc5x0uVegto…...
Go 语言与时间拳击理论下的结对编程:开启高效研发编程之旅
一、引言 结对编程作为一种软件开发方法,在提高代码质量、增强团队协作等方面具有显著优势。而时间拳击理论为结对编程带来了新的思考角度。本文将以 Go 语言为中心,深入探讨时间拳击理论下的结对编程。 在当今软件开发领域,高效的开发方法和…...
Qt+OPC开发笔记(一):OPCUA介绍、open62541介绍、编译与基础环境Demo
若该文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/144516882 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV…...
ElasticSearch 常见故障解析与修复秘籍
文章目录 一、ElasticSearch启动服务提示无法使用root用户二、ElasticSearch启动提示进程可拥有的虚拟内存少三、ElasticSearch提示用户拥有的可创建文件描述符太少四、ElasticSearch集群yellow状态分析五、ElasticSearch节点磁盘使用率过高,read_only状态问题解决六…...
序列模型的使用示例
序列模型的使用示例 1 RNN原理1.1 序列模型的输入输出1.2 循环神经网络(RNN)1.3 RNN的公式表示2 数据的尺寸 3 PyTorch中查看RNN的参数4 PyTorch中实现RNN(1)RNN实例化(2)forward函数(3…...
对rust的全局变量使用drop方法
文章目录 rust处理全局变量的策略方法1:在main中自动Drop全局变量 参考 rust处理全局变量的策略 Rust 的静态变量不会在程序退出时自动调用 Drop,因为它们的生命周期与进程绑定。 use std::sync::OnceLock;struct GlobalData {content: String, }impl …...
Node.js教程入门第一课:环境安装
对于一个程序员来说,每学习一个新东西的时候,第一步基本上都是先进行环境的搭建! 从本章节开始让我们开始探索Node.js的世界吧! 什么是Node.js? 那么什么是Node.js呢?简单的说Node.js 就是运行在服务端的 JavaScript JavaScript…...
Visual Studio 使用 GitHub Copilot 扩展
🎀🎀🎀【AI辅助编程系列】🎀🎀🎀 Visual Studio 使用 GitHub Copilot 与 IntelliCode 辅助编码Visual Studio 安装和管理 GitHub CopilotVisual Studio 使用 GitHub Copilot 扩展Visual Studio 使用 GitHu…...
【Qualcomm】IPQ5018获取TR069 WiFi 接口Stats状态方法
IPQ5018 简介 IPQ5018 是高通(Qualcomm)公司推出的一款面向网络设备的系统级芯片(SoC)。它通常用于路由器、接入点和其他网络设备中,提供高性能的无线网络连接。以下是关于 IPQ5018 的一些关键特性和功能: 关键特性 高性能处理器 IPQ5018 集成了多核 CPU,通常是 ARM …...
数字营销咨询,照亮企业营销数字化每一步
在快消品领域,面对市场竞争日益激烈的现状,营销端的数字化升级已经成为企业生意增长的重要驱动力。 然而,鉴于营销端数字化建设的高昂成本及其广泛覆盖的业务范畴,企业在启动此类项目之前,通常会遭遇一系列挑战与顾虑&…...
修改vscode中emmet中jsx和tsx语法中className的扩展符号从单引号到双引号 - HTML代码补全 - 单引号双引号
效果图 实现步骤 文件 > 首选项 > 设置搜索“”在settings.json中修改,增加 "emmet.syntaxProfiles": {"html": {"attr_quotes": "single"},"jsx": {"attr_quotes": "double","…...
【Cmake】
1 设置安装路径 -DCMAKE_INSTALL_PREFIX"安装路径"2 使用交叉编译 -DCMAKE_C_COMPILE"交叉编译器绝对路径"3 编译静态库 -DPAHO_BUILD_STARTTRUE...
Flutter 内嵌 unity3d for android
前言: 最近刚整完 unity3d hybridCLR 更新代码和资源,我们 趁热打铁 将 Unity3D 嵌入 Flutter 应用中。实现在 Flutter 使用 Unity3D, 可以做 小游戏 大游戏; 之前都是 内嵌 Webview 来实现的。虽然 CocosCreator 做出来的效果也不错…...
sqlite加密-QtCipherSqlitePlugin 上
1、下载并解压软件 https://download.csdn.net/download/notfindjob/90140129 2、编译(可支持Qt5.12编译) 3、安装插件...
正交投影 (Orthographic Projection) 详解
正交投影 (Orthographic Projection) 详解 正交投影是一种将三维空间中的物体投影到二维平面上的方法,它在计算机图形学、建筑设计、工程绘图等领域中广泛应用。与透视投影不同,正交投影不会随着距离的变化而改变物体的大小,因此所有平行线在…...
盛元广通畜牧与水产品检验技术研究所LIMS系统
一、系统概述 盛元广通畜牧与水产品检验技术研究所LIMS系统集成了检测流程管理、样品管理、仪器设备管理、质量控制、数据记录与分析、合规性管理等功能于一体,能够帮助实验室实现全流程的数字化管理。在水产、畜牧产品的质检实验室中,LIMS系统通过引入…...
三维空间刚体运动4-1:四元数表示变换(各形式相互转换加代码——下篇)
三维空间刚体运动4-1:四元数表示变换(各形式相互转换加代码——下篇) 4. 四元数到其它旋转表示的相互转换4.1 旋转向量4.2 旋转矩阵4.3 欧拉角4.3.1 转换关系4.3.2 转换中的万象锁问题 5. 四元数的其他性质5.1 旋转的复合5.2 双倍覆盖5.3 指数…...
PyTorch如何通过 torch.unbind 和torch.stack动态调整张量的维度顺序
笔者一篇博客PyTorch 的 torch.unbind 函数详解与进阶应用:中英双语中有一个例子如下: # 创建一个 3x2x2 的三维张量 x torch.tensor([[[1, 2], [3, 4]],[[5, 6], [7, 8]],[[9, 10], [11, 12]]])# 第一步:沿第 0 维分解为 3 个 2x2 张量 un…...
如何高效获取学术文献:Zotero-SciPDF自动下载插件完全指南
如何高效获取学术文献:Zotero-SciPDF自动下载插件完全指南 【免费下载链接】zotero-scipdf Download PDF from Sci-Hub automatically For Zotero7 项目地址: https://gitcode.com/gh_mirrors/zo/zotero-scipdf 作为学术研究工作者,你是否经常为查…...
Intv_AI_MK11 Android应用集成指南:在移动端调用AI模型服务
Intv_AI_MK11 Android应用集成指南:在移动端调用AI模型服务 1. 移动端AI集成的价值与挑战 想象一下,你的Android应用突然拥有了理解用户意图、自动生成图片描述甚至进行自然对话的能力。这正是Intv_AI_MK11这类云端AI模型能为移动应用带来的变革。但在…...
VBA UserForm控件交互实战:跨窗体数据传递与动态更新
1. UserForm基础与跨窗体数据传递原理 刚接触VBA UserForm时,我经常被各种控件的交互问题困扰。特别是当需要多个窗体协同工作时,数据传递就成了大难题。记得有次做订单管理系统,主窗体收集客户信息,子窗体处理产品明细࿰…...
解决SlowFast环境配置中的‘No module named torch._six’等疑难杂症:从修改压缩包到调整import路径
SlowFast环境配置深度排障指南:从源码修改到路径调整的完整解决方案 在视频理解领域,SlowFast作为Facebook Research开源的优秀框架,凭借其双路径网络设计在动作识别任务中表现出色。然而,许多开发者在环境配置阶段就会遭遇各种&q…...
探索XPopup:一款强大的Android弹窗库,让UI交互更灵动
探索XPopup:一款强大的Android弹窗库,让UI交互更灵动 【免费下载链接】XPopup 🔥XPopup2.0版本重磅来袭,2倍以上性能提升,带来可观的动画性能优化和交互细节的提升!!!功能强大&#…...
2026届学术党必备的十大AI写作助手推荐榜单
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 知网AIGC检测服务的目的是辅助识别学术文本里由人工智能生成的内容,该技术凭借对…...
重磅发布!集装箱式SST直流移动智算中心
NEWS3月28日,台达、汉腾科技与龙芯中科联合宣布重磅发布集装箱式 SST(固态变压器)直流移动智算中心,发布活动于台达吴江制造基地举行。这款全新方案以台达 SST 固态变压器为核心能源支撑,深度集成CPU、AI 加速卡与服务…...
Agent在零售行业能解决哪些痛点?——深度解析零售企业智能自动化转型路径
在2026年零售行业加速迈向智能化的背景下,AI Agent(人工智能智能体)已不再仅仅是技术实验室的产物,而是演变为重构行业价值链的核心驱动力。传统的零售运营长期受困于人力密集型模式,面临着全球化运营复杂度高、数据孤…...
4款降AI率工具实测横评:最便宜和最贵的效果差多少?
花了几百块,测了一圈,现在把结果告诉你。 降AI率工具、降AI工具保姆级测评2026、降AI这个需求,不同工具之间差距其实挺明显的,不是"随便用一个都一样"。 我的结论:嘎嘎降AI(www.aigcleaner.com…...
STM32F407ZGT6最小系统:从原理图到PCB的实战设计解析
1. STM32F407ZGT6最小系统设计入门 第一次接触STM32F407ZGT6最小系统设计时,我也被各种专业术语和复杂的电路图搞得晕头转向。但经过几个项目的实战后,我发现只要掌握几个关键模块,设计一个稳定可靠的最小系统其实并不难。STM32F407ZGT6是STM…...
