编译与链接(C/C++)

        在C/C++中关于代码的运行需要经过.c文件到.exe文件,而其中走过这些步骤这需要对原始的.c文件进行编译链接。对于编译与链接主要构成了翻译环境,经过翻译环境之后生成.exe文件,然后在通过运行环境输出对应的结果。本篇主要讲解编译与链接。

        以上过程即就是一个.c源文件被运行需要经过的步骤。 

1.翻译环境

        翻译环境有编译链接两个大的过程所组成,其中,编译可以分为:预处理(预编译)、编译、汇编三个过程。通过编译过程将多个.c源文件转化为.obj目标文件(windows为.obj,Linux为.o),生成多个目标文件之后,由连接器将多个目标文件与链接库进行链接,然后就生成了可执行程序.exe

        链接库:运行时库(支持程序运行的基本函数集合)或者第三方库。

        对于以上过程中的编译还可细分为预处理(预编译)、编译、汇编。其中编译又可分为词法分析、语法分析和词义分析。

        经过预处理过程之后会生成 .i 为后缀的文件;

        经过编译过程之后的文件会生成后缀为 .s 的文件;

        经过汇编之后则生成 .obj 为后缀的目标文件。

1.1预处理(预编译)

        在预处理阶段,源文件和头文件会被处理成为 .i 为后缀的文件。

        在gcc环境下可以观察到对test.c文件预处理之后的 .i 文件,输入命令如下:

gcc -E test.c -o test.i

        输入以上命令则可以得出对应的 .i 文件,观察以上的文件,我们可以发现,在 .i 文件之中,由我们写的代码段已经被放在了1000多行,而#define定义的MAX在预处理文件中也直接被代换为了100,而在我们写的代码段以上1000多行的代码,则是<stdio.h>库中所包含的代码,而且#if与#endif也消失了。所以,在预处理过程中,主要进行了如下的过程:

        1.将所有#define删除,并展开所有的宏定义(即将所有#define定义的变量代换为对应的值或者表达式)。

        2.处理所有的条件编译指令,如:#if 、#ifdef、#elif、#else、#endif。

        3.处理#include预编译指令,将包含的头文件的内容插入到该预编译指令的位置。这个过程是递归进行的,也就是说被包含的头文件也可能包含其他文件。

        4.删除掉所有的注释(将注释转化为空格)

        5.或保留所有的#pragma的编译器指令,编译器后续会使用。

        经过预处理后的 .i 文件中不再包含宏定义,因为宏定义已经被展开。并且包含的头文件都被插入到 .i 文件中。所以当我们无法知道宏定义或者头文件是否包含正确的时候,可以查看预处理后的 .i 文件来确认。

1.2编译

        编译主要经过三个过程:词法分析、语法分析、语义分析,生成相应的汇编代码文件。

        在gcc环境下,编译过程的命令如下:

gcc -S test.i -o test.s

        现在以以下代码进行编译时的步骤进行举例:

array[index]=(index+4)*(2+6)
1.2.1 词法分析 

        将源代码程序被输入扫描器,扫描器的任务就是简单的进行词法分析,把代码中的字符分割成一系列的记号(关键字、标识符、字面量、特殊字符等等)。

        对以上代码进行词法分析得到16和记号:

记号arrar[index]=(index+4)*(2+6)
类型标识符方括号标识符     方括号赋值括号标识符加号数字括号乘号括号数字加号数字括号

        经过词法分析之后,我们就开始语法分析了。

 1.2.2 语法分析

        对扫描产生的记号进行语法分析,从而产生语法树,语法树是以表达式为结点的二叉树。如下:

        以上就是通过语法分析生成的语法树,接下来就是语义分析。

1.2.3 语义分析

        由语义分析器来完成语义分析,即对表达式的语法层面分析。编译器所能做的分析是语义的静态分析。静态语义分析通常包括声明和类型的匹配,类型的转换等等,在这个阶段会报告出语法信息。

1.3汇编

        汇编器将汇编代码转化为机器可执行的指令(即二进制代码串),每一个汇编语句几乎都对应一条机器指令。根据汇编指令和机器指令的对照表一一进行翻译,也不做指令优化。

        汇编的命令如下:

gcc -c test.s -o test.o

        如上图所示的汇编指令,因为是二进制,所以用文本文件打开是乱码的形式。 

1.4链接

        链接就是将一堆文件链接在一起生成可执行程序.exe,其中,链接的主要过程包括:地址和空间分配,符号决议和重定位

        链接解决的是一个项目中多文件、多模块之间相互调用的问题。如下的代码:

        在每个源文件都是单独经过编译器处理生成对应的目标文件。test.c经过编译器生成test.o;add.c经过编译器生成add.o,我们在test.c中使用了add函数和g_val变量,因为在test.c中起始并不知道这个函数与变量的地址,所以暂时先搁置,等待最后链接的时候由连接器根据引用的符号Add在其他 模块查找到Add函数的地址,然后在将test.c中所引用到Add的指令重新进行修正,让test.c中Add的地址为真正的Add函数地址,对全局变量g_val同样,这样的地址修正过程被称为:重定位

2.运行环境

        关于运行环境,本篇便简要概括:

        1.程序必须载入内存之中。在有操作系统的环境中:一般这个由操作系统完成。而在独立的环境中,程序的载入必须手工控制,也可能是通过可执行代码置入只读内存来完成。

        2.程序的执行一开始,就调用main函数。

        3.开始执行程序代码。这个时候程序将使用一个运行时堆栈,存储函数的局部变量和返回地址。程序同时也可以使用静态内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值。

        4.终止程序。可能是正常终止main函数也有可能是意外终止。

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/626681.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ElasticSearch扫盲概念篇[ES系列] - 第500篇

历史文章&#xff08;文章累计500&#xff09; 《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 E…

Hudi0.14.0最新编译(修订版)

1 编译环境 Java1.8maven3.9.3hadoop3.3.4hive3.1.3spark3.2.1flink1.16.0hudi0.14.02 hudi准备 2.1 源码 $ git clone https://github.com/apache/hudi.git $ cd hudi $ git checkout release-0.14.02.2 修改pom文件 2.2.1 新增repository加速依赖下载 <

KT148A语音芯片智能锁扩展语音地址以及如何支持大量小文件的打包

一、语音芯片应用于智能锁的需求 智能锁的语音播放需求中&#xff0c;有很多需要多国语言合并在一起的需求 其中语音文件数多&#xff0c;并且每个语音文件小的特点 如果使用OTP的语音芯片&#xff0c;就很麻烦&#xff0c;因为用户不可烧录&#xff0c;调试也很繁琐 同时大…

【严重】GitLab 账号接管漏洞

漏洞描述 GitLab 是由GitLab公司开发的、基于Git的集成软件开发平台。 GitLab CE/EE中支持用户通过辅助电子邮件地址重置密码&#xff0c;默认情况允许通过未经确认电子邮件重置密码。攻击者可以利用此漏洞将用户帐户密码重置电子邮件发送任意未经验证的电子邮件地址&#xff…

算法竞赛备赛进阶之数位DP训练

数位DP的思想就是对每一位进行DP&#xff0c;计算时记忆化每一位可以有的状态&#xff0c;其作用是减少运算时间&#xff0c;避免重复计算。 数位DP是一种计数用的DP&#xff0c;一般就是要统计一个区间[A,B]内满足一些条件数的个数。 以1e9甚至1e18、1e100的问题为例&#x…

YOLOv8改进 | 主干篇 | EfficientViT高效的特征提取网络完爆MobileNet系列(轻量化网络结构)

一、本文介绍 本文给大家带来的改进机制是主干网络,一个名字EfficientViT的特征提取网络(和之前发布的只是同名但不是同一个),其基本原理是提升视觉变换器在高效处理高分辨率视觉任务的能力。它采用了创新的建筑模块设计,包括三明治布局和级联群组注意力模块。其是一种高效率…

【ELK 学习】ElasticSearch

ELK&#xff1a;ElasticSearch存储&#xff0c;Logstash收集&#xff0c;Kibana展示 版本较多&#xff0c;使用时需要版本匹配&#xff0c;还需要和mysql版本匹配&#xff08;elastic官网给了版本对应关系&#xff09; 本次使用的版本es6.8.12 filebeat 轻量级的数据收集工具 …

多视图多标签学习

一、多视图学习 多视图学习又称多视角学习&#xff0c;在实际应用问题中&#xff0c;对于同一事物可以从多种不同的途径或不同的角度进行描述&#xff0c;这些不同的描述构成了事物的多个视图。例如&#xff1a;在与人们生活息息相关的互联网中&#xff0c;网页数据既可以用网…

贴心管家式集运服务,象样集运让海外华人集运更加省心、放心、安心!

在这个全球化的时代&#xff0c;海外华人对于跨境购物的需求与日俱增&#xff0c;而集运服务作为连接国内购物与海外收货的重要桥梁&#xff0c;其重要性不言而喻。 而在这种需求之下&#xff0c;有一家集运公司—象样集运&#xff0c;提出了“贴心管家式集运服务”。今天给大…

04.阿里Java开发手册——注释规约

【强制】类、类属性、类方法的注释必须使用 Javadoc 规范&#xff0c;使用/**内容*/格式&#xff0c;不得使用// xxx 方式。 说明&#xff1a;在 IDE 编辑窗口中&#xff0c;Javadoc 方式会提示相关注释&#xff0c;生成 Javadoc 可以正确输出相应注释&#xff1b;在 IDE中&…

C++ 设计模式之享元模式

【声明】本题目来源于卡码网&#xff08;题目页面 (kamacoder.com)&#xff09; 【提示&#xff1a;如果不想看文字介绍&#xff0c;可以直接跳转到C编码部分】 【简介】什么是享元模式 -- 可重复使用 享元模式是⼀种结构型设计模式&#xff0c;在享元模式中&#xff0c;对象被…

我记不住的那些位操作bitwise(一)

背景&#xff1a; 最近在看底层的一些知识内容&#xff0c;其中有一些位操作&#xff0c;所以想复习并记录一下。 一、或 或&#xff1a; 0 | 1 1 及 1 | 1 1 但是无法区分这两种情况(1. 一个是false&#xff0c;另一个是true&#xff1b; 2. 这两个都是true) 在C语…

前端知识汇编(持续更新中)

前端知识汇编 1. 浅析cookie sessionStorage localStorage 1. 浅析cookie sessionStorage localStorage cookie、Web Storage 同&#xff1a; 保存在浏览器端都有同源限制&#xff08;cookie&#xff1a;与特定域绑定&#xff0c;不被其他域访问&#xff1b;sessionStorage&a…

自定义shell工具函数之has_config()

这段代码是一个Shell脚本中的函数&#xff0c;名为pull_images。让我来解释一下这段代码的功能&#xff1a; function pull_images() {images_to$(get_images)pids()trap kill ${pids[*]} SIGINT SIGTERMfor image in ${images_to}; dopull_image "$image" &pid…

PDF控件Spire.PDF for .NET【安全】演示:更改 PDF 文档的安全权限

当您使用密码保护 PDF 文档时&#xff0c;您可以选择指定一组权限。权限决定用户如何与文件交互。例如&#xff0c;您可以对文档应用权限以禁止用户打印或使用剪切和粘贴操作。本文演示如何在C# 和 VB.NET中使用Spire.PDF for .NET更改 PDF 文档的安全权限。 Spire.PDF for .N…

HTML5 article标签,<time>...</time>标签和pubdate属性的运用

1、<article>...</article>标签的运用 article标签代表文档、页面或应用程序中独立的、完整的、可以独自被外部引用的内容。它可以是一篇博客或报竟杂志中的文章、一篇论坛帖子、一段用户评论或一个独立的插件&#xff0c;或者其他任何独立的内容。把文章正文放在h…

新喜报,新希望!英码科技荣登“2023年广州拟上市领头羊TOP50企业榜单”

近日&#xff0c;广州市资本市场融资对接服务平台启动仪式暨2023年拟上市企业“领头羊”评选总结活动成功举办。活动现场发布了2023年广州“拟上市领头羊TOP 50 企业榜单”、“最受资本关注TOP10榜单”、“最强科创TOP10榜单”、“最具成长TOP10榜单”并为企业颁发牌匾&#xf…

PHP手机号码归属地批量查询系统 V2024

PHP手机号码归属地批量查询系统 V2024 全部完整代码压缩后只有445KB(代码50.1万行数据); 安全建议:数据库名称DB改为自己指导的名称(本页参数两个文件文件名) 或者伪静态规则&#xff0c;限制.json格式和.db格式文件下载 性能:30条批量查询相应时间0.014秒左右; 数据压缩&#…

HCIA 网络基础:

应用层 抽象语言-->编码 表示层 编码-->二进制 会话层 建立会话&#xff0c;提供绘画地址。 应用于程序内部进行区分&#xff0c;没有统一标准 上三层主要是软件层面&#xff08;应用 程序处理数据&#xff09; 下四层主要负责数据传输 传输层 端口号 分段 &#xff…

【温故而知新】HTML5新标签canvas、MathML

文章目录 一、概念二、新标签三、canvas四、SVG五、MathML 一、概念 HTML5是HTML的最新版本&#xff0c;它引入了许多新的元素和功能&#xff0c;以适应现代网页开发的需求。以下是HTML5的一些主要特点&#xff1a; 新增语义元素&#xff1a;HTML5引入了许多新的语义元素&…