程序的编译与链接

简介:     一个源程序到一个可执行程序一般需要经过预编译、编译、汇编、链接四个步骤。 1、什么预编译 预编译过程主要处理源文件中以“#”开始的预编译指令。

    一个源程序到一个可执行程序一般需要经过预编译、编译、汇编、链接四个步骤。


1、什么预编译

预编译过程主要处理源文件中以“#”开始的预编译指令。比如“#include”,“#define”等,主要处理规则如下:

(1)、将所有的“#define”删除,并且展开所有的宏定义
(2)、处理所有的条件预编译指令,比如“#if”,“#ifdef”,“#endif”
(3)、处理“#include”指令,将被包含的文件插入到该预编译指令的位置,注意这个过程是递归进行的,也就是说被包含的文件可能还包含其他文件
(4)、删除所有的注释“//”、“/**/”
(5)、添加行号和文件名标识,以便于编译时编译器产生调试用的行号信息以及用于编译时产生的编译错误或警告时显示的行号
(6)、保留所有的#program编译器指令

   进过预编译后,生成的文件不包含任何的宏定义。


2、什么是编译

C/C++/PAS程序,首先把预处理完的源文件进行一些词法分析、语法分析、语义分析及优化后得生成相应的汇编代码文件。

image图 程序编译示意图

3、什么是汇编

将汇编代码转变成机器可执行的指令,即中间编译成中间代码文件即中间目标文件ObjectFile(Windows下是.obj,UNIX下是.o文件)。

编译时,编译器需要的是语法的正确,函数与变量的声明的正确。通常,程序员需要告诉编译器头文件所在的位置(头文件应该只是声明,而定义应该放在C/CPP文件中),只有所有的语法正确,编译器才编译出中间目标文件。

一般来说,每个源文件都应该对应于一个中间目标文件(O文件或OBJ文件)。

 

4、什么是链接

将大量的ObjectFile合成执行文件,称之链接link。

链接时,主要是链接函数和全局变量,所以可以使用中间目标文件来链接应用程序。链接器不管函数所有的源文件 ,只管函数的中间目标文件,在大多数时候,由于源文件 太多,编译生成的中间目标文件太多,而在链接时需要明显指出中间目标文件名,这对编译很不方便。所以我们要给中间目标文件打个包,在windows下这种包叫库文件即.lib文件,UNIX下是Archlive File即.a文件。

 

小结:

程序源文件首先会生成中间目标文件,再由中间目标文件生成执行文件。在编译时,编译顺只检测程序语法,和函数、变量是否被声明。如果函数未被声明,编译器会给出一个警告,但可以生成Object File。而链接程序时,链接器会在所有的Object File中搭建函数的实现,如果找不到,就会报链接错误。


参考文献:

陈皓《跟我一起写Makefile》

http://blog.csdn.net/zldeng_scir/article/details/7495505

相关文章
|
11月前
|
边缘计算 运维 5G
5G承载网是5G无线接入网与核心网之间的通信管道,负责高效传输数据,保障高速率、低时延和高可靠性
5G承载网是5G无线接入网与核心网之间的通信管道,负责高效传输数据,保障高速率、低时延和高可靠性。关键技术包括灵活以太网、网络切片、光传输和智能管控,支持多样化业务需求。未来将更加智能化、融合化和绿色节能,推动5G网络的快速发展。
782 4
|
6月前
|
机器学习/深度学习 传感器 人工智能
《AI领航:解锁机器人分布式智能控制的奥秘》
机器人分布式智能控制技术正推动多机器人协同作业迈向新高度。借助人工智能,特别是多智能体强化学习(MARL)和分布式深度学习,机器人可自主学习、优化决策并高效协作。在仓储物流、智能工厂及灾难救援等场景中,机器人通过实时通信与数据共享完成复杂任务。然而,随着系统规模扩大,通信成本与计算负担增加,需引入联邦学习等方法保障数据隐私与可靠性。同时,环境感知与决策融合技术解决信息不确定性问题,提升整体性能。这一领域的持续创新将为机器人协作开辟更广泛的应用前景。
|
Prometheus 监控 数据可视化
性能测试:主流性能监控工具介绍
Linux系统中,`vmstat`和`top`提供基本监控;Nmon是实时性能分析工具,轻量且功能丰富;Collectd+InfluxDB+Grafana组合用于系统数据收集、存储和可视化;Prometheus+Grafana则提供灵活的监控和定制化仪表板。这些工具帮助企业监控系统性能,及时发现和解决问题。
|
存储 程序员 定位技术
程序员必知:安卓的四大组件
程序员必知:安卓的四大组件
352 0
|
存储 关系型数据库 MySQL
【MySQL进阶之路 | 基础篇】表的创建与操作表
【MySQL进阶之路 | 基础篇】表的创建与操作表
|
消息中间件 网络协议 前端开发
为什么有HTTP协议,还要有websocket协议 1
为什么有HTTP协议,还要有websocket协议
305 1
为什么有HTTP协议,还要有websocket协议 1
|
安全 Unix Shell
CTF靶场练习
翻了翻自己的文档,看见有一篇之前打CTF练习留下的文章,对文章做了修整,然后正文如下: 开始对目标进行了一波信息搜集,端口只开放了80端口,其他端口并不是很有帮助,不得不提nmap的协议识别功能非常好用,并且还自带扫目录的功能。
313 0
|
机器学习/深度学习 算法 搜索推荐
相似性度量的各种距离(Distance)计算归类详解及应用(强烈建议收藏!!!备用)
相似性度量的各种距离(Distance)计算归类详解及应用(强烈建议收藏!!!备用)
相似性度量的各种距离(Distance)计算归类详解及应用(强烈建议收藏!!!备用)
|
编解码 人机交互 vr&ar
世界最大游戏展化身虚拟现实秀的背后
今年的 E3 没有新硬件放出,新游戏成为绝对主角。除过 PC 游戏开始缓慢复苏并释放出新的活力外,首次大规模亮相的虚拟现实游戏成为新亮点。因为虚拟现实新技术所带来的全新体验,游戏产业正在迎来迄今为止最大的变革。
268 1
世界最大游戏展化身虚拟现实秀的背后
|
缓存
OushuDB 管理指南系统扩容均衡HDFS
OushuDB 管理指南系统扩容均衡HDFS
185 0
OushuDB 管理指南系统扩容均衡HDFS