C语言梦开始的地方21:编译和链接

发布时间:2026/10/28 21:30:45

C语言梦开始的地方21:编译和链接 文章目录C语言梦开始的地方21编译和链接翻译环境和运行环境翻译环境预处理编译词法分析语法分析语义分析汇编链接运行环境C语言梦开始的地方21编译和链接上一章我们了解了C语言的文件操作系统的数据文件和对数据的文件的各种操作。本章章节我们来了解一下C语言的.c文件是如何变成.exe文件的。翻译环境和运行环境在 ANSI C 的任何一种实现中存在两个不同的环境。第1种是翻译环境在这个环境中源代码被转换为可执行的机器指令二进制指令。第2种是执行环境它用于实际执行代码。那么翻译环境中的编译和链接做了哪些操作才使.c文件转换成了.exe文件呢翻译环境首先我们就得展开开讲解一下翻译环境所做的事情。其实翻译环境是由编译和链接两个大的过程组成的而编译又可以分解成预处理有些书也叫预编译、编译、汇编三个过程。一个C语言项目中可能存在多个.c文件一起构建那多个.c文件是如何生成可执行程序呢多个.c文件单独经过编译器编译处理生成对应的目标文件。注在Windows环境下的目标文件的后缀是.objLinux环境下目标文件的后缀是.o多个目标文件和链接库一起经过链接器处理生成最终的可执行程序。链接库是指运行时库(它是支持程序运行的基本函数集合)或者第三方库。通过上述的步骤才使.c文件构建成了我们能运行的.exe文件以GCC为例就是下面这种场景下面会出现一些gcc的命令使用这些命令并不需要去Linux上。我们只需要去安装一下VSCode和mingW即可。在VSCode中要安装一个C/C的插件。安装好后就可以编写和运行C/C代码了预处理在预处理阶段源文件和头文件会被处理成为.i为后缀的文件。在gcc环境下想观察一下对test.c文件预处理后的.i文件命令如下gcc-Etest.c-otest.i使用也很简单在VSCode中点击Ctrl 即可预处理阶段主要处理那些源文件中#开始的预编译指令。比如#include,#define处理的规则如下将所有的#define删除并展开所有的宏定义。处理所有的条件编译指令如#if、#ifdef、#elif、#else、#endif。处理#include 预编译指令将包含的头文件的内容插入到该预编译指令的位置。这个过程是递归进行的也就是说被包含的头文件也可能包含其他文件。删除所有的注释添加行号和文件名标识方便后续编译器生成调试信息等。或保留所有的#pragma的编译器指令编译器后续会使用。经过预处理后的.i文件中不再包含宏定义因为宏已经被展开。并且包含的头文件都被插入到.i文件中。所以当我们无法知道宏定义或者头文件是否包含正确的时候可以查看预处理后的.i文件来确认。编译编译过程就是将预处理后的文件进行一系列的词法分析、语法分析、语义分析及优化生成相应的汇编代码文件。编译过程的命令如下gcc-Stest.i-otest.s对下面代码进行编译的时候会怎么做呢假设有下面的代码array[index](index4)*(26);词法分析首先我们得先了解词法分析分析的是什么词法分析就像扫描器将源代码程序输入扫描器扫描器的任务就是简单的进行词法分析把代码中的字符分割成一系列的记号关键字、标识符、字面量、特殊字符等。比如将英文符号写成了中文符号“”inta10此时词法分析就像扫描器一样将int a 10进行分割 校验。回到我们最开始的代码问题上面程序进行词法分析后得到了16个记号记号类型array标识符[左方括号index标识符]右方括号赋值(左圆括号index标识符加号4数字)右圆括号*乘号(左圆括号2数字加号6数字)右圆括号常见的报错原因中文标点符号如中文分号、中文引号“”混入代码。字符串或字符常量缺少闭合引号如 char *s “hello;此时扫描器会一直扫描到文件末尾都找不到”报错 missing terminating character。语法分析语法分析则像解析器Parser根据语法规则检查记号流时发现结构不符合C语言的文法规则即语句结构写错了。上述代码在语法分析就如下图所示常见报错原因通常是大括号、括号、分号不匹配或者关键字使用位置错误。语义分析语义分析语法正确但语句的含义不符合语言规范。语义分析器Semantic Analyzer会检查类型系统、声明匹配、作用域规则等。常见报错原因类型不兼容、使用了未声明的变量/函数、重复定义、赋值类型冲突等。汇编汇编器是将汇编代码转转变成机器可执行的指令每一个汇编语句几乎都对应一条机器指令。就是根据汇编指令和机器指令的对照表一一的进行翻译也不做指令优化。gcc-ctest.s-otest.o汇编一般有一下用途读汇编是排查“挂死”和“栈溢出”的。写出“高性能”代码。比如操作是否是原子的理解“未定义行为”的诡异后果下面我们来简单的读一下C语言转汇编代码intmain(){inta10;intb20;intcab;returnc;}转换后的汇编代码.file test.c .text .globl main .def main; .scl 2; .type 32; .endef .seh_proc main main: pushq %rbp .seh_pushreg %rbp movq %rsp, %rbp .seh_setframe %rbp, 0 subq $48, %rsp .seh_stackalloc 48 .seh_endprologue call __main movl $10, -4(%rbp) movl $20, -8(%rbp) movl -4(%rbp), %edx movl -8(%rbp), %eax addl %edx, %eax movl %eax, -12(%rbp) movl -12(%rbp), %eax addq $48, %rsp popq %rbp ret .seh_endproc .def __main; .scl 2; .type 32; .endef .ident GCC: (Rev2, Built by MSYS2 project) 16.1.0看汇编通常是看中间汇编代码比如上述代码就是从call __main开始阅读movl $10, -4(%rbp) # 将 10 存入 rbp-4 地址变量 a movl $20, -8(%rbp) # 将 20 存入 rbp-8 地址变量 b movl -4(%rbp), %edx # 把 arbp-4的值放入 edx 寄存器 movl -8(%rbp), %eax # 把 brbp-8的值放入 eax 寄存器 addl %edx, %eax # eax edx eax 即 eax a b movl %eax, -12(%rbp) # 将 eax 的结果存回 rbp-12变量 c movl -12(%rbp), %eax # 将 c 的值放入 eax因为 eax 是返回值寄存器 addq $48, %rsp # 释放之前分配的 48 字节栈空间 popq %rbp # 恢复调用者的 rbp ret # 返回因为在不同的环境会得出不一样的汇编代码上述是在Windows 11的环境下使用VSCode运行出来的如果换成Linux那么汇编也会有所不同。链接链接是一个复杂的过程链接的时候需要把一堆文件链接在一起才生成可执行程序。链接过程主要包括地址和空间分配符号决议和重定位等这些步骤。链接解决的是一个项目中多文件、多模块之间互相调用的问题比如在一个C的项目中有2个.c文件test.c和add.c代码如下test.c#includestdio.hexternintAdd(intx,inty);externintg_val;intmain(){intx10,y20;printf(%d\n,Add(x,y));return0;}add.cintg_val2022;intAdd(intx,inty){returnxy;}test.c中调用了Add函数和使用了g_val变量但它们定义在add.c中。编译test.c时编译器不知道Add和g_val的地址因此暂时将这些引用搁置生成未解析的符号。链接时链接器在所有目标文件test.o和add.o及库中查找这些符号的定义找到后将test.o中所有引用Add和g_val的指令地址修正为真正的内存地址而这个地址修正的过程也被叫做重定位。gcc环境gcc test.o add.o-otestmsvc环境直接点击运行即可。运行环境载入内存有操作系统时由操作系统载入独立环境如嵌入式需手工安排或固化到ROM。程序启动调用 main 函数。运行时资源堆栈stack存储局部变量、函数返回地址等。静态内存static存储全局变量和静态变量程序运行期间一直保留。终止正常执行完毕main 返回或意外终止。我们在函数栈帧中再去了解运行环境。完
延伸阅读

更多相关文章

2026/10/22 6:24:15

盘点第二届世界人形机器人运动会的“乐子”与“门道”

【EI检索会议 | SPIE出版】 2026年智能计算与多模态信号处理国际学术会议(CIMSP 2026)-CSDN博客文章浏览阅读730次,点赞24次,收藏6次。2026年智能计算与多模态信号处理国际学术会议(CIMSP2026)将于8月21-23…

2026/10/26 19:32:49

基于YOLOv8的航拍滑坡检测实战:数据集构建与模型部署全流程

简介:本资源为面向遥感图像分析与地质灾害智能识别领域的航拍滑坡检测专用数据集,适用于计算机视觉初学者至中级研究者开展目标检测模型训练与算法验证。数据集共4315张512512分辨率航拍图像,全部标注为单类别“landslide”,配套4…

2026/10/28 4:13:12

滚动轴承故障诊断Python实战:从模型到工业部署

简介:本资源是一套面向计算机及相关专业本科生的滚动轴承故障诊断毕业设计实战项目,聚焦工业设备智能运维场景,为大作业、课程设计及毕业课题提供完整可复现的深度学习解决方案。资源包含41个文件,以30个CWRU轴承故障数据集MAT文件…

2026/10/29 20:49:28

YRC1000重故障报警排查指南:从代码表到排障路线图

简介:面向安川MOTOMAN机器人调试与维护人员的YRC1000报警代码速查资料,聚焦控制柜故障诊断这一高频需求场景。内容按重故障报警篇与轻故障报警篇两类组织,覆盖报警编号、报警名称、内容说明、子代码含义、原因分析与对策建议等条目&#xff0…

2026/10/29 20:49:28

化学反应工程仿真:从动力学到三维反应器的建模策略与接口选型

简介:这份PDF面向化工、环境科学、能源工程等领域的工程师、科研人员及高校师生,系统讲解COMSOL Multiphysics 4.4版化学反应工程模块的建模思路与仿真方法,帮助读者理解并预测反应系统的动力学与空间行为。内容涵盖完全混合与塞流反应器的动…

2026/10/29 20:49:28

PyTorch实现高效图像去雨:EfficientDeRain系统详解

1. 项目概述:基于PyTorch的EfficientDeRain去雨系统雨天拍摄的图像往往存在雨滴、雨丝造成的遮挡和模糊问题,这给计算机视觉任务(如自动驾驶、视频监控)带来巨大挑战。我们开发的EfficientDeRain系统采用PyTorch框架实现&#xff…

2026/10/29 20:49:28

基于PyTorch的EfficientDeRain:深度学习图像去雨技术解析

1. 项目概述:当AI遇见雨天摄影雨天拍摄的照片总是让人又爱又恨——浪漫的氛围背后是难以避免的雨滴干扰。传统图像处理技术在这个问题上往往力不从心,直到深度学习带来了转机。这个基于PyTorch框架的EfficientDeRain系统,正是专门为解决这个痛…

2026/10/29 20:49:28

企业级AI模型训练:挑战、策略与工程实践

1. 企业级AI模型训练的核心挑战与应对策略 当AI模型从实验室走向企业生产环境时,训练规模会呈现指数级增长。我们团队最近完成的一个金融风控模型训练项目,原始数据量达到3.2PB,需要在2周内完成分布式训练。这种场景下,传统的单机…

2026/10/29 20:39:02

Java+MySQL疫情物资管理系统设计与实现指南

1. 项目概述:疫情物资管理系统的现实意义 2020年以来的全球公共卫生事件让物资管理系统从边缘课题变成了刚需。我去年指导的毕业设计中,有超过30%的学生选择了相关课题,但普遍存在"重界面轻业务"的问题。这个基于JavaMySQL的物资管…

2026/10/29 17:05:52

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/29 17:06:02

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/29 17:06:13

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/29 0:03:42

学生选课系统DFD图绘制指南:边界划分与分层校验实战

简介:文档以顶层与第一层DFD图为核心,完整刻画学生选课系统的逻辑模型,面向软件工程课程设计、系统分析学习及毕设前期建模人群。顶层图界定系统边界,外部实体包括管理员、教师和学生三类角色;第一层图进一步细化用户登…

2026/10/29 0:03:42

JIRA敏捷落地:Scrum角色权限、Sprint与燃尽图避坑指南

简介:围绕“基于JIRA的敏捷开发项目管理”这一主题,面向产品负责人、Scrum Master及研发测试成员,梳理Scrum角色分工、迭代流程与JIRA工具配置的对应关系,适合初、中级团队导入敏捷管理时参考。压缩包共1个docx文件,大…

2026/10/29 0:03:42

SEMI S8人机工程验收实战:从条款拆解到现场实测的完整指南

简介:面向半导体设备设计、制造与运维工程师及安全合规人员,这份资料聚焦SEMI标准体系下的设备安全规范,重点收录SEMI S8-0308《半导体制造设备人体工程学工程安全指南》。内容围绕设备设计原则、错误与事故预防、人体工程学适配三大主线展开…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑