C/C++ :程序环境和预处理(上)

简介: C/C++ :程序环境和预处理(上)

目录

程序的编译链接过程

1.编译过程中的预处理阶段

2.编译过程中的正式编译阶段

3.编译过程中的汇编阶段

4.链接过程

程序的编译链接过程
一个程序的源码文件要经过复杂的编译链接过程才能被转换为可执行的机器指令(二进制指令)

编译链接过程概述:

编译过程:组成一个程序的每个源码文件通过编译过程分别被转换成目标文件(linux下为.o文件)
(注意每个源文件的编译过程都是分别独立进行的)
链接过程:每个目标文件(.o文件)由链接器(linker)链接在一起,形成一个单一而完整的可执行程序(.exe文件)
编译链接过程图:

1.编译过程中的预处理阶段
源码中的 # 修饰的语句代表预处理指令;

编译过程的预处理阶段(预处理阶段进行的是一些文本操作)主要完成的事情:

include所指向的头文件中的所有内容会被"复制粘贴"到#include语句所在的源文件中

define定义的符号的替换

注释的删除
注意:该阶段不进行语法检查

一个源码文件的预处理完成后会生成一个对应的 .i 源码文件

在win10的gcc编译环境下用vscode对源码文件进行预处理,在终端中输入:

gcc -E ./文件名 -o 输出的文件名(任意取)
编译器执行指令后便得到被预处理的源文件对应形成的.i文件:

2.编译过程中的正式编译阶段
编译过程的正式编译阶段主要完成的事情:

对文件中的源码进行语法检查以及各种分析(语法有误则报出编译错误)
将 .i 文件中的源代码翻译成汇编代码,生成.s文件
进行符号汇总
符号汇总会将.i文件中所有函数,全局变量的名称经过修饰后全部汇总起来,为符号表的生成做准备。(符号表在链接过程中起到重要作用)

在win10的gcc编译环境下用vscode对.i文件进行正式编译,在终端中输入:

gcc -S ./test.i
生成.s文件(汇编代码)

3.编译过程中的汇编阶段
编译过程的汇编阶段主要完成的事情:

将存储汇编指令的.s文件汇编成 .o文件(二进制文件)
形成符号表
符号表中存储了.s文件中所有函数经修饰后的名称(以及对应函数体的地址),所有全局变量经修饰后的名称(以及定义它们的指令的地址);

注意如果当前源文件没有定义某个被调用的函数(或全局变量),那么在符号表中该函数(或全局变量)所对应的地址将为无效地址(等到链接阶段再完成寻址)
比如:

4.链接过程
链接过程主要完成的事情:

各.o文件的合并
各.o文件的符号表的合并
比如:

链接过程完成后如果符号表中的无效地址仍然无法得到确定,编译器就会报出链接错误
C++中修改了C语言符号表中对函数名的修饰规则,为函数重载提供了底层机制上的支持.参见:函数重载

相关文章
|
算法
雪花算法id生成器
雪花算法id生成器
752 0
|
8月前
|
安全 大数据 数据挖掘
课时9:阿里云Web应用防火墙:全面保障网站的安全与可用性
阿里云Web应用防火墙(WAF)基于阿里巴巴十年攻防经验,提供全面的网站安全防护。它通过Web应用防护、CC攻击防护和业务风控,有效应对各类网络威胁,确保网站的安全与可用性。智能双引擎技术降低误报率,实时数据分析和虚拟补丁更新保障系统安全。WAF已成功护航多个重大活动,为企业提供高效、简便的安全解决方案。
218 0
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之idea本地测试代码,要增大 Flink CDC 在本地 IDEA 测试环境中的内存大小如何解决
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
250 1
|
JavaScript 前端开发 Java
基于springboot的留守儿童爱心网站
这是一个基于SpringBoot的留守儿童爱心网站,包含管理员和用户两种角色。管理员负责用户、新闻、志愿活动、捐赠等管理;用户可进行登录注册、爱心捐赠及活动报名。项目采用SpringBoot与Mybatis作为后端框架,前端则使用HTML和VUE。适用于JDK1.8、IDEA/Eclipse、MySQL5.7/8.x,无需特定Tomcat或Maven版本,支持Windows系统。
261 13
基于springboot的留守儿童爱心网站
|
11月前
|
项目管理
工作效率为何总跟不上?问题出在哪?
本文探讨了项目进度管理效率低下的普遍问题及其根本原因,包括任务规划不清、信息不对称、协作不畅等,并介绍了板栗看板这款工具如何通过清晰的任务视图、实时更新与协作、任务优先级设置等功能,帮助团队提升工作效率,实现高效的项目管理和任务协作。
|
机器学习/深度学习 人工智能 自然语言处理
探索深度学习的未来:从模型架构到应用场景
在信息技术飞速发展的时代,深度学习作为人工智能的核心领域正不断推动科技前沿。本文将探讨深度学习的最新发展趋势,包括模型架构的创新和实际应用场景的拓展。同时,我们将分析当前面临的挑战以及未来可能的发展方向,旨在为读者提供一个全面的视角,了解这一充满潜力的技术领域。
474 27
|
设计模式 算法 程序员
【C++】大气、正规的编程习惯:C++学习路径与注意事项
【C++】大气、正规的编程习惯:C++学习路径与注意事项
241 0
|
存储 缓存 分布式计算
【大数据】计算引擎MapReduce
【大数据】计算引擎MapReduce
515 0
|
缓存 边缘计算 网络协议
阿里云CDN介绍
阿里云CDN介绍
420 0
|
存储 数据可视化 关系型数据库
Grafana【部署 01】可视化工具 Grafana 8.2.0 专业版安装配置及使用(SHA256完整性验证)
Grafana【部署 01】可视化工具 Grafana 8.2.0 专业版安装配置及使用(SHA256完整性验证)
275 0