【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程序开发中不可或缺的部分,理解它们有助于更好地进行程序开发和调试。

结语

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

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

持续更新中~!

相关推荐
奔跑吧邓邓子1 小时前
【C语言实战(6)】解锁C语言循环密码:for循环实战探秘
c语言·实战·for循环
GilgameshJSS1 小时前
STM32H743-ARM例程15-RTC
c语言·arm开发·stm32·实时音视频
pu_taoc1 小时前
深入剖析:基于epoll与主从Reactor模型的高性能服务器设计与实现
服务器·c语言·c++·vscode
韧竹、4 小时前
数据结构之顺序表
c语言·数据结构
努力努力再努力wz9 小时前
【C++进阶系列】:万字详解智能指针(附模拟实现的源码)
java·linux·c语言·开发语言·数据结构·c++·python
凤年徐9 小时前
【C++】string的模拟实现
c语言·开发语言·c++
迎風吹頭髮11 小时前
UNIX下C语言编程与实践59-UNIX TCP 数据传输:send 与 recv 函数的使用与数据处理
c语言·网络·unix
迎風吹頭髮11 小时前
UNIX下C语言编程与实践55-TCP 协议基础:面向连接的可靠传输机制与三次握手、四次挥手
c语言·网络·unix
迎風吹頭髮13 小时前
UNIX下C语言编程与实践35-UNIX 守护进程编写:后台执行、脱离终端、清除掩码与信号处理
java·c语言·unix
qiuiuiu41314 小时前
正点原子RK3568学习日记-GIT
linux·c语言·开发语言·单片机