【C语言回顾】编译和链接

  • 前言
  • [1. 编译](#1. 编译)
  • [2. 链接](#2. 链接)
  • 结语


上期回顾: 【C语言回顾】文件操作
个人主页:C_GUIQU
归属专栏:【C语言学习】

前言

各位小伙伴大家好!上期小编给大家讲解了C语言中的文件操作,接下来我们讲解一下编译和链接!

1. 编译

  1. 预处理(Preprocessing)
    • 宏定义处理 :展开源代码中的宏定义,例如#define PI 3.14159
    • 文件包含 :处理#include指令,将头文件的内容插入到源文件中。
    • 条件编译 :根据#ifdef#ifndef等条件编译指令,选择性地编译代码片段。
    • 删除注释:删除源代码中的注释。
    • 预处理后,生成一个.i.ii文件。
  2. 编译(Compilation)
    • 词法分析:将预处理后的文本分割成一个个的记号(token)。
    • 语法分析:根据C语言的语法规则,将记号组织成语法结构,如表达式、语句、声明等,形成抽象语法树(AST)。
    • 语义分析:检查语法结构的语义是否正确,如变量类型匹配、作用域规则等。
    • 代码生成:将AST转换成中间代码,再进一步优化和转换成目标代码,通常是汇编语言。
    • 编译后,生成汇编语言文件,通常是.s文件。

2. 链接

  1. 汇编(Assembly)
    • 汇编 :将汇编语言文件(.s)转换成机器语言指令,生成目标代码(.o.obj)。
    • 目标代码中包含机器指令,但不包含全局变量和函数的地址信息。
  2. 链接(Linking)
    • 合并段 :将所有目标文件的.text(代码段)、.data(已初始化数据段)、.bss(未初始化数据段)合并。
    • 符号解析:将各个目标文件中引用的符号(如函数和变量)解析为具体的地址。
    • 重定位:确定所有符号的最终地址,并修改代码中的引用地址。
    • 消除冗余:去除未使用的函数和变量,优化最终的可执行文件。
    • 链接后,生成可执行文件(如Windows下的.exe,Linux下的无后缀文件)。
      在整个过程中,编译器和链接器是两个关键的工具。编译器负责将源代码转换成机器代码,而链接器负责将编译后的代码合并成一个可执行文件。这两个步骤是C程序开发中不可或缺的部分,理解它们有助于更好地进行程序开发和调试。

结语

以上就是小编对编译和链接的详细讲解。

如果觉得小编讲的还可以,还请一键三连。互三必回!

持续更新中~!

相关推荐
历程里程碑16 分钟前
各种排序法大全
c语言·数据结构·笔记·算法·排序算法
树在风中摇曳21 分钟前
带哨兵位的双向循环链表详解(含 C 代码)+ LeetCode138 深度解析 + 顺序表 vs 链表缓存机制对比(图解 CPU 层级)
c语言·链表·缓存
雨落在了我的手上1 小时前
C语言入门(二十一):字符函数和字符串函数(1)
c语言
embrace991 小时前
【C语言学习】结构体详解
android·c语言·开发语言·数据结构·学习·算法·青少年编程
EXtreme352 小时前
深入浅出数据结构:手把手实现动态顺序表,从此不再怕数组扩容!
c语言·顺序表·malloc·realloc
薛慕昭13 小时前
嵌入式 C 语言猜大小游戏设计与实现
c语言·游戏
月光技术杂谈14 小时前
实战:C驱动框架嵌入Rust模块的互操作机制与完整流程
c语言·开发语言·rust·ffi·跨语言·bindgen·互操作
合作小小程序员小小店15 小时前
游戏开发,桌面%小游戏,贪吃蛇%demo,基于vs2022,c语言,easyX,无数据库
c语言·开发语言
WongKyunban19 小时前
Linux中的线程是什么?
c语言
LaoZhangGong12320 小时前
以太网HTTP数据包格式分析
c语言·stm32·网络协议·http·tcp·arp