当前位置: 首页 > 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 函…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录

ASP.NET Core 是一个跨平台的开源框架&#xff0c;用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录&#xff0c;以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

vue3 定时器-定义全局方法 vue+ts

1.创建ts文件 路径&#xff1a;src/utils/timer.ts 完整代码&#xff1a; import { onUnmounted } from vuetype TimerCallback (...args: any[]) > voidexport function useGlobalTimer() {const timers: Map<number, NodeJS.Timeout> new Map()// 创建定时器con…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

AI编程--插件对比分析:CodeRider、GitHub Copilot及其他

AI编程插件对比分析&#xff1a;CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展&#xff0c;AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者&#xff0c;分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比

目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec&#xff1f; IPsec VPN 5.1 IPsec传输模式&#xff08;Transport Mode&#xff09; 5.2 IPsec隧道模式&#xff08;Tunne…...

Python 训练营打卡 Day 47

注意力热力图可视化 在day 46代码的基础上&#xff0c;对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...

mac:大模型系列测试

0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何&#xff0c;是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试&#xff0c;是可以跑通文章里面的代码。训练速度也是很快的。 注意…...

Ubuntu系统多网卡多相机IP设置方法

目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机&#xff0c;交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息&#xff0c;系统版本&#xff1a;Ubuntu22.04.5 LTS&#xff1b;内核版本…...

五子棋测试用例

一.项目背景 1.1 项目简介 传统棋类文化的推广 五子棋是一种古老的棋类游戏&#xff0c;有着深厚的文化底蕴。通过将五子棋制作成网页游戏&#xff0c;可以让更多的人了解和接触到这一传统棋类文化。无论是国内还是国外的玩家&#xff0c;都可以通过网页五子棋感受到东方棋类…...