linux入门---程序翻译的过程
我们在vs编译器中写的代码按下ctrl f5就可以直接运行起来,并且会将运行的结果显示到显示器上,这里看上去只有一个步骤但实际上这里会存在很多的细节,比如说生成结果在这里插入代码片
之前我们的代码会经过预处理,编译,汇编,链接的过程,不同的过程会对应不同的操作,那么接下来我们就会一个一个的介绍这些操作所对应的操作。
预处理
程序运行的第一步就是预处理,预处理的目的就是:将头文件展开,去掉注释,宏替换,删除条件编译,比如说我们创建一个临时文件test.c:
并且在这个文件里面输入一些内容:
1 #include<stdio.h> 2 #define NUM_A 20 3 #define NUM_B 30 4 int main()5 {6 #ifdef add7 printf("相加的结果为:%d\n",NUM_A+NUM_B);//计算相加的结果8 #else9 printf("相减的结果为:%d\n",NUM_A-NUM_B);//计算相减的结果 10 #endif 11 return 0; 12 }
然后我们就退出并且保存这个文件:
到这里我们的准备工作就完成了。平时我们运行文件使用的指令是:gcc test.c
使用这个指令会自动的生成一个文件叫a.out,并且这个文件是一个可执行程序,我们运行一下这个程序就可以可以看到我们的屏幕上面出现了上面代码的运行的结果:
但是这里有个问题,使用这个指令我们看不到预处理的结果它直接变成了可执行程序,所以得在这个指令里面添加一个-E选项,这个选项的功能就是从重现在开始进行程序的翻译,将程序的预处理执行完后就停下来,所以使用这个选项我们就可以看到代码经过预处理之后的结果,那么这里的指令就是这样:gcc -E test.c
执行的结果如下:
我们可以看到这里出现很多乱七八糟的内容,那是因为这个指令将执行的结果全部都打印到屏幕上了,由于内容很多就显得很乱,不好查看,所以这里我们还可以在这个指令里面添加一个-o选项,这个选项的功能就是将指令的运行的结果放到一个文件里面,在-o的后面加上你要放的文件,如果这个文件不存在的话,这个指令会自动生成对应的文件,比如说我们将上面的指令修改成这样:gcc -E test.c -o test.i
当前目录下是没有test.i这个文件的,所以使用这个指令后我们会自动的生成test.i这个文件:
并且这个文件里面装的内容就是之前显示在屏幕上的内容:
我们可以使用vs指令将test.c文件显示在屏幕上进行对比:
我们使用shift+g将右边屏幕的光标移动到最后一行:
我们可以看到在test.i文件的最后出现了test.c文件中的大致内容,但是却略有不同这是test.i的相关内容:
这是test.c的全部内容:
仔细的观察一下我们可以看到有以下几点的不同:
- test.c中的2 3 行定义的宏被删除了。
- test.c中的7 9行的注释被删除了。
- test.c中的7 9行中使用的宏被替换成了我们定义的值也就是说NUM_A替换成了20,NUM_B替换成了30。
- test.c中没有被执行的条件编译被删除了也就是第6 7 8 10行的内容被删除了。
- test.c中的头文件被删除了但是在test.i中出现了更多杂七杂八的东西,所以在预编译的过程中将头文件中的内容加载到test.i的文件里面。
那么这就是预编译所做的一些操作将头文件展开,去掉注释,宏替换,删除条件编译,那么这里大家要注意的一点就是在linux操作系统中文件的后缀是没有意义的,也就是说这里的后缀i对于操作系统来说是没有什么特殊意义的,但是这个后缀对我们使用者来说却有很多的意义,比如说我们看到了一个文件的后缀是i就可以想到这个文件是经过预处理后生成的文件,所以大家在执行这些操作生成文件的时候还是要将后缀写成对应的形式以免混淆别人,那么上面就是预处理要干的事情。
编译
经历完预处理之后要执行的操作就是编译,编译要干的事情就是将c语言翻译成汇编语言,那么这里要执行的指令就是:gcc -S test.i -o test.s
那么这里-S选项的作用就是从现在开始进行程序的翻译,将汇编工作完成之后工作就停止,后面加了一个-o选项,所以这里会将执行完之后的结果放到test.s这个文件里面,执行完这个指令我们就可以看到这里自动的生成了一个test.s文件,在这个文件里面有我们好多我们看不懂的内容:
虽然下面的内容我们看不懂,但是可以知道的一件事就是这个test.o文件里面的内容是汇编语言:
我们知道计算器能够识别的语言是二进制语言,而test.o文件里面装的是汇编语言,所以这里的test.o文件无法被运行。
汇编
通过上面的讲解我们知道编译是将c语言翻译成汇编语言,那么这里的汇编要干的事情就是将生成的汇编语言翻译二进制语言,那么这里需要的指令就是:gcc -c test.s -o test.o
,-c选项的作用就是从现在开始进行翻译,将文件中的汇编语言翻译成二进制语言就停止,比如说下面的操作:
这里就自动生成一个test.o文件,我们打开这个文件就可以看到文件中的内容就变成了各种奇奇怪怪的符号:
这就是文件经过汇编之后的结果,那么这时肯定会有小伙伴想啊,既然这个文件的内容是二进制的话,我们是不是就可以运行这个文件呢?那么这里可以试一下看看能不能运行
结果很明显这个文件是无法运行的,原因也非常的简单因为我们上述的三个过程(预处理 编译 汇编)所干的事情是翻译的过程,也就是把你的代码进行修剪然后翻译成二进制文件,但是这里有个问题就是你的代码里面用了很多别人的函数,你没有在这个文件里面实现这些函数,比如说printf函数,scanf函数,main函数等等,这些函数你都没有实现,虽然你包含了头文件stdio.h,但是这个文件里面只有这些函数的声明,没有这些实现,所以将我们的代码翻译成二进制文件还是无法满足运行的需求,所以这里我们还得进行下一步链接。
链接
链接干的事情就是把我们自己写的代码代码和c标准库的代码合并起来,这个标准库里面装的就是各种c语言函数的具体实现等等,所以当二进制文件经过链接后,里面使用的函数就有了具体的实现,就可以正常的被执行了,那么这里的用的之指令就是:gcc test.o
这里我们不使用-o选项的话,这里就会自动生成一个名为a.out的可执行程序,当然这里我们也可以人为的生成一个可执行程序,那么这里就得加上一个-o选项,那么这里的指令就是:gcc test.o -o mytest
当生成完可执行程序之后就可以运行以下这里的可执行文件:
那么上述就是这篇文章的全部内容希望大家可以理解谢谢。
相关文章:

linux入门---程序翻译的过程
我们在vs编译器中写的代码按下ctrl f5就可以直接运行起来,并且会将运行的结果显示到显示器上,这里看上去只有一个步骤但实际上这里会存在很多的细节,比如说生成结果在这里插入代码片之前我们的代码会经过预处理,编译,汇…...

springboot复习(黑马)
学习目标基于SpringBoot框架的程序开发步骤熟练使用SpringBoot配置信息修改服务器配置基于SpringBoot的完成SSM整合项目开发一、SpringBoot简介1. 入门案例问题导入SpringMVC的HelloWord程序大家还记得吗?SpringBoot是由Pivotal团队提供的全新框架,其设计…...

C++指针详解
旧文更新:两三年的旧文了,一直放在电脑里,现在直接传上CSDN 一、指针的概念 1.1 指针 程序运行时每个变量都会有一块内存空间,变量的值就存放在这块空间中。程序可以通过变量名直接访问这块空间内的数据,这种访问方…...

tauri+vite+vue3开发环境下创建、启动运行和打包发布
目录 1.创建项目 2.安装依赖 3.启动项目 4.打包生成windows安装包 5.安装打包生成的安装包 1.创建项目 运行下面命令创建一个tauri项目 pnpm create tauri-app 我创建该项目时的node版本为16.15.0 兼容性注意 Vite 需要 Node.js 版本 14.18,16。然而&#x…...

安卓进阶系列-系统基础
文章目录计算机结构冯诺依曼结构哈弗结构冯诺依曼结构与哈弗结构对比安卓采用的架构安卓操作系统进程间通讯(IPC)内存共享linux内存共享安卓内存共享管道Unix Domain Socket同步常见同步机制信号量Mutex管程安卓同步机制安卓中的Mutex安卓中的ConditionB…...

10 Wifi网络的封装
概述 Wifi有多种工作模式,比如:STA模式、AccessPoint模式、Monitor模式、Ad-hoc模式、Mesh模式等。但在IPC设备上,主要使用STA和AccessPoint这两种模式。下面分别进行介绍。 STA模式:任何一种无线网卡都可以运行在此模式,这种模式也是无线网卡的默认模式。在此模式下,无线…...

手把手的教你安装PyCharm --Pycharm安装详细教程(一)(非常详细,非常实用)
简介 Jetbrains家族和Pycharm版本划分: pycharm是Jetbrains家族中的一个明星产品,Jetbrains开发了许多好用的编辑器,包括Java编辑器(IntelliJ IDEA)、JavaScript编辑器(WebStorm)、PHP编辑器&…...

开发板与ubantu文件传送
接下来的所以实验都通过下面这种方式发送APP文件到开发板运行 目录 1、在ubantu配置 ①在虚拟机上添加一个桥接模式的虚拟网卡 ②设定网卡 ③在网卡上配置静态地址 2、开发板设置 ①查看网卡 ②配置网卡静态ip 3、 测试 ①ping ②文件传送 传送报错情况 配置环境&#…...

如何成为一名优秀的网络安全工程师?
前言 这是我的建议如何成为网络安全工程师,你应该按照下面顺序学习。 简要说明 第一件事你应该学习如何编程,我建议首先学python,然后是java。 (非必须)接下来学习一些算法和数据结构是很有帮助的,它将…...

面试问题之高并发内存池项目
项目部分 1.这个项目是什么? 高并发内存池的原型是谷歌一个开源项目,tcmalloc,而这个项目,就是tcmalloc中最核心的框架和部分拿出来进行模拟。他的作用就是在去代替原型的内存分配函数malloc和free。这个项目涉及的技术有,c&…...
如果阿里巴巴给蒋凡“百亿补贴”
出品 | 何玺 排版 | 叶媛 2021底,阿里内部进行组织架构大调整,任命蒋凡为阿里海外商业负责人,分管全球速卖通和国际贸易(ICBU)两个海外业务,以及Lazada等面向海外市场的多家子公司。 一年时间过去&#x…...
Linux版本现状
Linux的发行版本可以大体分为两类,一类是商业公司维护的发行版本,一类是社区组织维护的发行版本,前者以著名的Red Hat(RHEL红帽)为代表,后者以Debian为代表。Red HatRedhat,应该称为Redhat系列&…...
Winform中实现保存配置到文件/项目启动时从文件中读取配置(序列化与反序列化对象)
场景 Winform中实现序列化指定类型的对象到指定的Xml文件和从指定的Xml文件中反序列化指定类型的对象: Winform中实现序列化指定类型的对象到指定的Xml文件和从指定的Xml文件中反序列化指定类型的对象_winform xml序列化_霸道流氓气质的博客-CSDN博客 上面讲的序…...

基于python的超市历年数据可视化分析
人生苦短 我用python Python其他实用资料:点击此处跳转文末名片获取 数据可视化分析目录人生苦短 我用python一、数据描述1、数据概览二、数据预处理0、导入包和数据1、列名重命名2、提取数据中时间,方便后续分析绘图三、数据可视化1、美国各个地区销售额的分布&…...

GPT-4技术报告
摘要 链接:https://cdn.openai.com/papers/gpt-4.pdf 我们汇报了GPT-4的发展,这是一个大规模的多模态模型,可以接受图像和文本输入并产生文本输出。虽然在许多现实场景中,GPT-4的能力不如人类,但它在各种专业和学术基…...
前端性能优化
总结 使用打包工具对代码进行打包压缩;引入css时采用link标签,并放入头部,使其与文档一起加载,减少页面卡顿时间;尽量减少dom结构的重排和重绘;使用css雪碧图,减少网络请求;对不同分…...

尚医通-(三十三)就诊人管理功能实现
目录: (1)前台用户系统-就诊人管理-需求说明 (2)就诊人管理-接口开发-列表接口 (3)就诊人管理-接口开发-其他接口 (4)前台用户系统-就诊人管理-前端整合 ࿰…...

《Spring Boot 趣味实战课》读书笔记(二)
牛刀小试——五分钟入门 Spring Boot 万物皆可 Hello World 创建一个 Web 工程 填写项目信息 选择依赖 从 IDEA 打开下载好的 Spring Boot 工程: 完成核心代码 创建 HelloController 类并编写 hello 方法 创建一个 HelloController 类,或者选择 Fi…...

Spring Cloud -- GateWay
为什么需要网关在微服务架构中,一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢?如果没有网关的存在,我们只能在客户端记录每个微服务的地址,然后分别去调用。这样的话会产生很多问题,例…...
【C语言】memcpy , memset等内存操作函数使用方法与注意事项
这个章节,我们探讨C语言内存操作函数。 重点介绍处理内存操作函数使用和注意事项 和内存函数如何模拟实现。 内存函数所需头文件 #include<string.h> 文章目录memcpymemcpy 函数模拟实现memmovememmove 函数模拟实现memcmpmemcmp 函数模拟实现memsetmemset 函…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

Android 之 kotlin 语言学习笔记三(Kotlin-Java 互操作)
参考官方文档:https://developer.android.google.cn/kotlin/interop?hlzh-cn 一、Java(供 Kotlin 使用) 1、不得使用硬关键字 不要使用 Kotlin 的任何硬关键字作为方法的名称 或字段。允许使用 Kotlin 的软关键字、修饰符关键字和特殊标识…...

听写流程自动化实践,轻量级教育辅助
随着智能教育工具的发展,越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式,也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建,…...

中医有效性探讨
文章目录 西医是如何发展到以生物化学为药理基础的现代医学?传统医学奠基期(远古 - 17 世纪)近代医学转型期(17 世纪 - 19 世纪末)现代医学成熟期(20世纪至今) 中医的源远流长和一脉相承远古至…...
【生成模型】视频生成论文调研
工作清单 上游应用方向:控制、速度、时长、高动态、多主体驱动 类型工作基础模型WAN / WAN-VACE / HunyuanVideo控制条件轨迹控制ATI~镜头控制ReCamMaster~多主体驱动Phantom~音频驱动Let Them Talk: Audio-Driven Multi-Person Conversational Video Generation速…...

排序算法总结(C++)
目录 一、稳定性二、排序算法选择、冒泡、插入排序归并排序随机快速排序堆排序基数排序计数排序 三、总结 一、稳定性 排序算法的稳定性是指:同样大小的样本 **(同样大小的数据)**在排序之后不会改变原始的相对次序。 稳定性对基础类型对象…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...