编译与链接(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…

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

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

算法竞赛备赛进阶之数位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;网页数据既可以用网…

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语…

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…

HCIA 网络基础:

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

Ubuntu开机自动挂载硬盘

前言&#xff1a; 因为我的电脑是WIN10 Ubuntu18.04双系统&#xff0c;且两个系统都装在C盘上&#xff0c;而D盘作为数据和代码存储盘&#xff0c;经常会开机就被访问&#xff0c;例如上一次关机前用VS Code访问D盘代码&#xff0c;然后下一次开机的时候打开VSCode发现打不开…

在window宿主机访问WSL2内部署的服务

目录 在window宿主机访问 WSL2 内部署的服务&#xff08;其他&#xff09;在 WSL2 内查看 windows&#xff08;宿主机&#xff09;的IP地址 windows内置了Linux系统&#xff08;WSL&#xff09;。 在window宿主机访问 WSL2 内部署的服务 在WSL下部署的项目&#xff0c;比如端口…

智能分析网关V4基于AI视频智能分析技术的周界安全防范方案

一、背景分析 随着科技的不断进步&#xff0c;AI视频智能检测技术已经成为周界安全防范的一种重要手段。A智能分析网关V4基于深度学习和计算机视觉技术&#xff0c;可以通过多种AI周界防范算法&#xff0c;实时、精准地监测人员入侵行为&#xff0c;及时发现异常情况并发出警报…

text expressing

文章目录 前言文本表示1文本特征概念介绍2 文本特征选择方法3 文本表示方法 text expressing3.1 One Hot(独热)编码3.2 TF-IDF 模型3.3 Word2Vec 参考链接&#xff1a; 前言 文本是一种非结构化的数据信息&#xff0c;是不可以直接被计算的。 文本表示的作用就是将这些非结构…

powershell的help

打开win10 的powershell窗口&#xff0c;输入help命令&#xff0c;可以得到如下说明&#xff1a; 有了help系统&#xff0c;可以方便地了解关于powershell的详细说明。

文献阅读(速读):Automating Deep Neural Network Model Selection for Edge Inference

目录 论文简介动机&#xff1a;为什么作者想要解决这个问题&#xff1f;贡献&#xff1a;作者在这篇论文中完成了什么工作(创新点)&#xff1f;规划&#xff1a;他们如何完成工作&#xff1f;自己的看法(作者如何得到的创新思路) 论文简介 作者 Bingqian Lu、Jianyi Yang、Lydi…

cesium设置近地天空盒 天空会倾斜

上篇文章讲解了如何设置近地天空盒&#xff0c;效果出来了还是发现天空是斜的 https://blog.csdn.net/m0_63701303/article/details/135618244 效果&#xff1a; 这里需要修改Cesium.skyBox的代码&#xff0c;代码如下直接全部复制组件内调用即可 skybox_nearground.js&…

分布式光伏运维平台在提高光伏电站发电效率解决方案

摘要&#xff1a;伴随着能源危机和环境恶化问题的日益加重&#xff0c;科技工作者进一步加大对新能源的开发和利用。太阳能光伏发电作为新型清洁能源的主力军&#xff0c;在实际生产生活中得到了广泛的应用。然而&#xff0c;光伏发电效率偏低&#xff0c;成为制约光伏发电发展…