Linux编辑器-gcc/g++使用

> 作者简介:დ旧言~,目前大二,现在学习Java,c,c++,Python等
> 座右铭:松树千年终是朽,槿花一日自为荣。

> 目标:熟练使用gcc/g++编译器

> 毒鸡汤:真正的失败不是你没有达到目标,而是你放弃了追求。

> 望小伙伴们点赞👍收藏✨加关注哟💕💕 

🌟前言

        前面咱们用vim来写代码,用起来有点怪怪的,今天咱们学一个新的编译器gcc/g++,这个编译器既可以编译C也可以编译C++,可谓必备之一学习工具呀。

主体

        学习这个编译器咱们得从这四大板块学习,什么是gcc/g++,gcc/g++程序翻译的四个阶段,函数库,gcc/g++的使用。



 🌙什么是gcc/g++

gcc是GCC中的GUN C Compiler(C 编译器)

g++是GCC中的GUN C++ Compiler(C++编译器)

  • 对于 *.c和*.cpp文件,gcc分别当做c和cpp文件编译(c和cpp的语法强度是不一样的)
  • 对于 *.c和*.cpp文件,g++则统一当做cpp文件编译
  • 使用g++编译文件时,g++会自动链接标准库STL,而gcc不会自动链接STL
  • gcc在编译C文件时,可使用的预定义宏是比较少的

🌙gcc/g++程序翻译的四个阶段

我们最初认识的C语言,我们知道C语言编译的经过四个过程:

  • 编辑:输入源程序并存盘(.C)
  • 编译:将源程序翻译为目标文件(.OBJ)
  • 链接:将目标文件生成可执行文件( .EXE)
  • 运行:执行.EXE文件,得到运行结果。

其实在gcc/g++编译过程和C语言的编译过程基本一致,在gcc/g++也经历四个过程,分别是 预处理,编译,汇编,链接 。那我们看看这四个过程都需要执行啥?

那我们四个阶段逐一分析!

 💫预处理

预处理功能主要包括宏定义,文件包含,条件编译,去注释等。

下面我们来演示预处理这个阶段程序所发生的变化

命令:gcc –E test1.c –o test1.i

  • gcc:表示用gcc这款编译器来编译test.c这个C语言程序
  • 选项 -E:该选项的作用是让 gcc 在预处理结束后停止编译过程。
  • 选项 -o:是指目标文件,.i为后缀的文件为已经过预处理的C原始程序。

我们创建一个test1.c文件

再打开test1.c文件

在test1.c写代码

下面我们来演示预处理这个阶段程序所发生的变化

命令:gcc –E test1.c –o test1.i

用vim打开文件: vim test1.i

 💫编译

在这个阶段中 ,gcc 首先要检查代码的规范性、是否有语法错误等 , 以确定代码的实际要做的工作 , 在检查 无误后,gcc 把代码翻译成汇编语言。
用户可以使用 “-S” 选项来进行查看 , 该选项只进行编译而不进行汇编 , 生成汇编代码。
命令: gcc -S test1.i -o test1.s
用vim打开文件: vim test1.s

💫汇编

汇编阶段是把编译阶段生成的 “.s” 文件转成目标文件
读者在此可使用选项 “-c” 就可看到汇编代码已转化为 “.o” 的二进制目标代码了
命令: gcc -c test1.s -o test1.o
用vim打开文件: vim test1.o

💫链接

在成功编译之后 , 就进入了链接阶段.
命令: gcc test1.o -o Test1
如果我们不使用-o选项来指定文件生成的名字时,生成的默认文件的名字就是 a.out,这里我们依然和上面保持一致,自己来命名生成的文件的名称。
这里 Test1的可执行程序。当我们直接执行它时就可以生成我们最终想要的结果:

🌙函数库

我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?

其实这是因为系统把这些函数实现都被做到名为libc.so.6的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。其实链接的本质就是如何将调用的库函数和标准的库关联起来。

 💫动态库

Linux动态库(Dynamic Link Library,简称为DLL)是一种在运行时加载的共享库文件,它包含了程序所需的函数、变量和数据等资源。与静态库相比,动态库在编译链接阶段不会被完全包含进可执行文件中,而是在程序运行时进行加载。

动态库在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“so”,如前面所述的libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,这点可以通过 file 命令验证。

动态链接:

 💫静态库

静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为.a

C和C++静态库需要我们自己去安装。

代码如下:

yum install -y glibc-static
yum install -y libstdc++-static

当我们安装完成后就可以对我们的程序进行静态链接了。

命令:gcc 源文件 -o 目标文件 -static

 💫动态库和静态库优缺点

  • 静态链接成功,我们的程序不需要依赖任何库,自己就可以独立运行。
  • 动态链接成功,我们的程序还是需要依赖动态库,一旦动态库缺失,我们的程序便无法运行。
  • 静态库由于是自生拷贝的问题,所以比较浪费空间。
  • 动态库因为可以做到被大家所共享方法,所以真正的实现永远都是在库中。程序内部只有地址,比较节省空间。
  • 静态库VS动态库:Linux默认使用的是动态链接和动态库。

🌙gcc/g++的使用

使用前我们得安装gcc和g++

yum install -y gcc
yum install -y gcc-c++ libstdc++-devel

下面是gcc和g++常用的选项:

  • -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
  • -S 编译到汇编语言不进行汇编和链接
  • -c 编译到目标代码
  • -o 文件输出到 文件
  • -static 此选项对生成的文件采用静态链接
  • -g 生成调试信息。GNU 调试器可利用该信息。
  • -shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
  • -O0
  • -O1
  • -O2
  • -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
  • -w 不生成任何警告信息。
  • -Wall 生成所有警告信息

 🌟结束语

       今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小说手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。

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

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

相关文章

75基于matlab的模拟退火算法优化TSP(SA-TSP),最优路径动态寻优,输出最优路径值、路径曲线、迭代曲线。

基于matlab的模拟退火算法优化TSP(SA-TSP),最优路径动态寻优,输出最优路径值、路径曲线、迭代曲线。数据可更换自己的,程序已调通,可直接运行。 75matlab模拟退火算法TSP问题 (xiaohongshu.com)

如何通过cpolar内网穿透工具实现远程访问本地postgreSQL

文章目录 前言1. 安装postgreSQL2. 本地连接postgreSQL3. Windows 安装 cpolar4. 配置postgreSQL公网地址5. 公网postgreSQL访问6. 固定连接公网地址7. postgreSQL固定地址连接测试 前言 PostgreSQL是一个功能非常强大的关系型数据库管理系统(RDBMS),下…

uniapp开发小程序,包过大解决方案

1、首先和大家说一下 微信小程序 主包限制不能超过2M 分包一共不能超过8M 然后具体解决优化步骤如下, 将主包进行分包 在pages.json 下subPackages里面进行配置分包 分包配置完 配置过的文件都需要进行修改对应的路径 2 、 在运行的时候 一定要勾选 压缩代码 有…

Android Termux安装MySQL,内网穿透实现公网远程访问

文章目录 前言1.安装MariaDB2.安装cpolar内网穿透工具3. 创建安全隧道映射mysql4. 公网远程连接5. 固定远程连接地址 前言 Android作为移动设备,尽管最初并非设计为服务器,但是随着技术的进步我们可以将Android配置为生产力工具,变成一个随身…

【电路笔记】-欧姆定律

欧姆定律 文章目录 欧姆定律1、概述2、AC电路的等效性2.1 输入电阻2.2 输入电感2.3 输入电容 3、欧姆定律的局部形式3.1 介绍和定义3.2 德鲁德模型(Drude Model)3.3 局部形式表达式 4、电阻和宏观欧姆定律5、总结 电流、电压和电阻之间的基本关系被称为欧姆定律,可能…

cpu飙高问题,案例分析(一)

一、复习知识点: CPU性能指标: load average:负载,linux查看的时候,通常显示如下: load average后面有三段数字:代表了系统1分钟,5分钟,15分钟平均负载。 形象的类别可…

使用npm发布自己的组件库

在日常开发中,我们习惯性的会封装一些个性化的组件以适配各种业务场景,突发奇想能不能建一个自己的组件库,今后在各种业务里可以自由下载安装自己的组件。 一. 项目搭建 首先直接使用vue-cli创建一个vue2版本的项目,并下载好ele…

Ps:陷印

在准备图像进行专业印刷之前,陷印 Trap是一个重要的步骤。 在彩色印刷中,多种颜色的墨水通常分别印刷。陷印是一种叠印技术,它可避免打印时印版的微小偏差或移动而使打印图像出现微小的缝隙。 进行陷印处理以纠正未对齐现象 A. 未对齐现象&am…

代码逻辑修复与其他爬虫ip库的应用

在一个项目中,由于需要设置 http_proxy 来爬虫IP访问网络,但在使用 requests 库下载文件时遇到了问题。具体表现为在执行 Python 脚本时,程序会阻塞并最终超时,无法正常完成文件下载。 解决方案 针对这个问题,我们可以…

VB.net读写S50/F08IC卡,修改卡片密码控制位源码

本示例使用设备:Android Linux RFID读写器NFC发卡器WEB可编程NDEF文本/智能海报/-淘宝网 (taobao.com) 函数声明 Module Module1读卡函数声明Public Declare Function piccreadex Lib "OUR_MIFARE.dll" (ByVal ctrlword As Byte, ByRef serial As Byte, …

基于单片机K型热电偶温度采集报警系统

**单片机设计介绍, 基于单片机K型热电偶温度采集报警系统 文章目录 一 概要简介系统特点系统组成工作原理应用领域 二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 # 基于单片机K型热电偶温度采集报警系统介绍 简介 该系统是基于单片…

【论文阅读笔记】Deep learning for time series classification: a review

【论文阅读笔记】Deep learning for time series classification: a review 摘要 在这篇文章中,作者通过对TSC的最新DNN架构进行实证研究,探讨了深度学习算法在TSC中的当前最新性能。文章提供了对DNNs在TSC的统一分类体系下在各种时间序列领域中的最成功…

8 Redis与Lua

LUA脚本语言是C开发的,类似存储过程,是为了实现完整的原子性操作,可以用来补充redis弱事务的缺点. 1、LUA脚本的好处 2、Lua脚本限流实战 支持分布式 import org.springframework.core.io.ClassPathResource; import org.springframework.data.redis…

Excel 文件比较工具 xlCompare 11.01 Crack

比较两个 Excel 文件之间的差异 xlCompare. xlCompare.com 是性能最佳的 Excel diff 工具,用于比较两个 Excel 文件或工作表并在线突出显示差异。xlCompare 包括免费的在线 Excel 和 CSV 文件比较服务以及用于比较和合并 Excel 文件的强大桌面工具。如果您想在线了…

软件测试: 测试用例

一. 软件测试四要素 测试环境,操作步骤,测试数据,预期结果 二. 基于需求进行测试用例的设计 基于需求设计测试用例是测试设计和开发测试用例的基础,第一步就要分析测试需求,验证需求是否正确,完整,无二义性,并且逻辑自洽.在需求正确的基础上细化测试需求,从测试需求提炼出一…

React整理总结(五、Redux)

1.Redux核心概念 纯函数 确定的输入,一定会产生确定的输出;函数在执行过程中,不能产生副作用 store 存储数据 action 更改数据 reducer 连接store和action的纯函数 将传入的state和action结合,生成一个新的state dispatc…

猫12分类:使用yolov5训练检测模型

前言: 在使用yolov5之前,尝试过到百度飞桨平台(小白不建议)、AutoDL平台(这个比较友好,经济实惠)训练模型。但还是没有本地训练模型来的舒服。因此远程了一台学校电脑来搭建自己的检测模型。配置…

hdfsClient_java对hdfs进行上传、下载、删除、移动、打印文件信息尚硅谷大海哥

Java可以通过Hadoop提供的HDFS Java API来控制HDFS。通过HDFS Java API,可以实现对HDFS的文件操作,包括文件的创建、读取、写入、删除等操作。 具体来说,Java可以通过HDFS Java API来创建一个HDFS文件系统对象,然后使用该对象来进…

集合的自反关系和对称关系

集合的自反关系和对称关系 一:集合的自反关系1:原理:2:代码实现 二:对称关系1:原理:2:代码实现 三:总结 一:集合的自反关系 1:原理: …

【python】直方图正则化详解和示例

直方图正则化(Histogram Normalization)是一种图像增强技术,目的是改变图像的直方图以改善图像的质量。具体来说,它通过将图像的直方图调整为指定的形状,以增强图像的对比度和亮度。 直方图正则化的基本步骤如下&…