当前位置: 首页 > news >正文

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的全部内容:
在这里插入图片描述

仔细的观察一下我们可以看到有以下几点的不同:

  1. test.c中的2 3 行定义的宏被删除了。
  2. test.c中的7 9行的注释被删除了。
  3. test.c中的7 9行中使用的宏被替换成了我们定义的值也就是说NUM_A替换成了20,NUM_B替换成了30。
  4. test.c中没有被执行的条件编译被删除了也就是第6 7 8 10行的内容被删除了。
  5. 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就可以直接运行起来&#xff0c;并且会将运行的结果显示到显示器上&#xff0c;这里看上去只有一个步骤但实际上这里会存在很多的细节&#xff0c;比如说生成结果在这里插入代码片之前我们的代码会经过预处理&#xff0c;编译&#xff0c;汇…...

springboot复习(黑马)

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

C++指针详解

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

tauri+vite+vue3开发环境下创建、启动运行和打包发布

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

安卓进阶系列-系统基础

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

10 Wifi网络的封装

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

手把手的教你安装PyCharm --Pycharm安装详细教程(一)(非常详细,非常实用)

简介 Jetbrains家族和Pycharm版本划分&#xff1a; pycharm是Jetbrains家族中的一个明星产品&#xff0c;Jetbrains开发了许多好用的编辑器&#xff0c;包括Java编辑器&#xff08;IntelliJ IDEA&#xff09;、JavaScript编辑器&#xff08;WebStorm&#xff09;、PHP编辑器&…...

开发板与ubantu文件传送

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

如何成为一名优秀的网络安全工程师?

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

面试问题之高并发内存池项目

项目部分 1.这个项目是什么? 高并发内存池的原型是谷歌一个开源项目&#xff0c;tcmalloc&#xff0c;而这个项目&#xff0c;就是tcmalloc中最核心的框架和部分拿出来进行模拟。他的作用就是在去代替原型的内存分配函数malloc和free。这个项目涉及的技术有&#xff0c;c&…...

如果阿里巴巴给蒋凡“百亿补贴”

出品 | 何玺 排版 | 叶媛 2021底&#xff0c;阿里内部进行组织架构大调整&#xff0c;任命蒋凡为阿里海外商业负责人&#xff0c;分管全球速卖通和国际贸易&#xff08;ICBU&#xff09;两个海外业务&#xff0c;以及Lazada等面向海外市场的多家子公司。 一年时间过去&#x…...

Linux版本现状

Linux的发行版本可以大体分为两类&#xff0c;一类是商业公司维护的发行版本&#xff0c;一类是社区组织维护的发行版本&#xff0c;前者以著名的Red Hat&#xff08;RHEL红帽&#xff09;为代表&#xff0c;后者以Debian为代表。Red HatRedhat&#xff0c;应该称为Redhat系列&…...

Winform中实现保存配置到文件/项目启动时从文件中读取配置(序列化与反序列化对象)

场景 Winform中实现序列化指定类型的对象到指定的Xml文件和从指定的Xml文件中反序列化指定类型的对象&#xff1a; Winform中实现序列化指定类型的对象到指定的Xml文件和从指定的Xml文件中反序列化指定类型的对象_winform xml序列化_霸道流氓气质的博客-CSDN博客 上面讲的序…...

基于python的超市历年数据可视化分析

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

GPT-4技术报告

摘要 链接&#xff1a;https://cdn.openai.com/papers/gpt-4.pdf 我们汇报了GPT-4的发展&#xff0c;这是一个大规模的多模态模型&#xff0c;可以接受图像和文本输入并产生文本输出。虽然在许多现实场景中&#xff0c;GPT-4的能力不如人类&#xff0c;但它在各种专业和学术基…...

前端性能优化

总结 使用打包工具对代码进行打包压缩&#xff1b;引入css时采用link标签&#xff0c;并放入头部&#xff0c;使其与文档一起加载&#xff0c;减少页面卡顿时间&#xff1b;尽量减少dom结构的重排和重绘&#xff1b;使用css雪碧图&#xff0c;减少网络请求&#xff1b;对不同分…...

尚医通-(三十三)就诊人管理功能实现

目录&#xff1a; &#xff08;1&#xff09;前台用户系统-就诊人管理-需求说明 &#xff08;2&#xff09;就诊人管理-接口开发-列表接口 &#xff08;3&#xff09;就诊人管理-接口开发-其他接口 &#xff08;4&#xff09;前台用户系统-就诊人管理-前端整合 &#xff0…...

《Spring Boot 趣味实战课》读书笔记(二)

牛刀小试——五分钟入门 Spring Boot 万物皆可 Hello World 创建一个 Web 工程 填写项目信息 选择依赖 从 IDEA 打开下载好的 Spring Boot 工程&#xff1a; 完成核心代码 创建 HelloController 类并编写 hello 方法 创建一个 HelloController 类&#xff0c;或者选择 Fi…...

Spring Cloud -- GateWay

为什么需要网关在微服务架构中&#xff0c;一个系统会被拆分为很多个微服务。那么作为客户端要如何去调用这么多的微服务呢&#xff1f;如果没有网关的存在&#xff0c;我们只能在客户端记录每个微服务的地址&#xff0c;然后分别去调用。这样的话会产生很多问题&#xff0c;例…...

【C语言】memcpy , memset等内存操作函数使用方法与注意事项

这个章节&#xff0c;我们探讨C语言内存操作函数。 重点介绍处理内存操作函数使用和注意事项 和内存函数如何模拟实现。 内存函数所需头文件 #include<string.h> 文章目录memcpymemcpy 函数模拟实现memmovememmove 函数模拟实现memcmpmemcmp 函数模拟实现memsetmemset 函…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

MODBUS TCP转CANopen 技术赋能高效协同作业

在现代工业自动化领域&#xff0c;MODBUS TCP和CANopen两种通讯协议因其稳定性和高效性被广泛应用于各种设备和系统中。而随着科技的不断进步&#xff0c;这两种通讯协议也正在被逐步融合&#xff0c;形成了一种新型的通讯方式——开疆智能MODBUS TCP转CANopen网关KJ-TCPC-CANP…...

ETLCloud可能遇到的问题有哪些?常见坑位解析

数据集成平台ETLCloud&#xff0c;主要用于支持数据的抽取&#xff08;Extract&#xff09;、转换&#xff08;Transform&#xff09;和加载&#xff08;Load&#xff09;过程。提供了一个简洁直观的界面&#xff0c;以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

GO协程(Goroutine)问题总结

在使用Go语言来编写代码时&#xff0c;遇到的一些问题总结一下 [参考文档]&#xff1a;https://www.topgoer.com/%E5%B9%B6%E5%8F%91%E7%BC%96%E7%A8%8B/goroutine.html 1. main()函数默认的Goroutine 场景再现&#xff1a; 今天在看到这个教程的时候&#xff0c;在自己的电…...

C语言中提供的第三方库之哈希表实现

一. 简介 前面一篇文章简单学习了C语言中第三方库&#xff08;uthash库&#xff09;提供对哈希表的操作&#xff0c;文章如下&#xff1a; C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...

Golang——7、包与接口详解

包与接口详解 1、Golang包详解1.1、Golang中包的定义和介绍1.2、Golang包管理工具go mod1.3、Golang中自定义包1.4、Golang中使用第三包1.5、init函数 2、接口详解2.1、接口的定义2.2、空接口2.3、类型断言2.4、结构体值接收者和指针接收者实现接口的区别2.5、一个结构体实现多…...

深度学习之模型压缩三驾马车:模型剪枝、模型量化、知识蒸馏

一、引言 在深度学习中&#xff0c;我们训练出的神经网络往往非常庞大&#xff08;比如像 ResNet、YOLOv8、Vision Transformer&#xff09;&#xff0c;虽然精度很高&#xff0c;但“太重”了&#xff0c;运行起来很慢&#xff0c;占用内存大&#xff0c;不适合部署到手机、摄…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...

前端开发者常用网站

Can I use网站&#xff1a;一个查询网页技术兼容性的网站 一个查询网页技术兼容性的网站Can I use&#xff1a;Can I use... Support tables for HTML5, CSS3, etc (查询浏览器对HTML5的支持情况) 权威网站&#xff1a;MDN JavaScript权威网站&#xff1a;JavaScript | MDN...