【Linux成长史】Linux编辑器-gcc/g++使用

news2024/12/26 11:31:10

🎬 博客主页:博主链接
🎥 本文由 M malloc 原创,首发于 CSDN🙉
🎄 学习专栏推荐:LeetCode刷题集 数据库专栏 初阶数据结构
🏅 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!
📆 未来很长,值得我们全力奔赴更美好的生活✨

在这里插入图片描述

文章目录

  • 😇本章详情
  • 😇Linux背景知识
    • ⏳预处理(进行宏替换,头文件展开等)
    • ⏳编译(生成汇编)
    • ⏳汇编(生成可执行文件或库文件)
    • ⏳连接(生成可执行文件或库文件)
    • ⏳函数库
    • ⏳函数库一般分为静态库和动态库两种
    • ⏳gcc指令选项
  • 📃如何巩固学习
  • 📃本文小结

在这里插入图片描述

😇本章详情

🐤本篇文章将讲授Linux的编辑器-gcc/g++的使用相关的知识。

通常在写代码的时候,我们一般用的都是IDE就是一些集成的开发工具。我们只需要手动的点一点就能进行编译了,那么其实我们并不懂其中的原理,这篇文章带你初步来了解一下这个过程吧,并且如何使用gcc。

😇Linux背景知识

⏳预处理(进行宏替换,头文件展开等)

功能:

预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
预处理指令是以#号开头的代码行。
实例: gcc –E hello.c –o hello.i
选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。


举例讲解
输入

gcc -E test.c -o test.i

输出
在这里插入图片描述

这里的我们生成了一个.i后缀的文件,这里就要科普一下了-o是指定生成了目标文件,一般.i文件名为后缀的就是已经处理过的C原始程序了。下面我们来看一张图就可以更好的理解啦!

输入

vim test.i 

输出
在这里插入图片描述

左边的test.i文件就是预处理生成的文件,而左边的test.c是没有经过预处理的文件,我们来看看差别吧!我们会发现我们看不到我们注释的东西了你们发现没!再来看,我们还把头文件展开了,还有一种条件编译,这个等以后再讲吧!

在这里插入图片描述

⏳编译(生成汇编)

在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。

用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
实例: gcc –S hello.i –o hello.s

生成汇编代码,其实很多代码的底层都是汇编,在计算机发展的过程中,最初的计算机都是贼大一台的,这时候那么伟大的科学家觉得这样不行,机器不便于携带,还贼贵,并且当时都是0101这样的数据格式,科学家觉得这样的计算量太大了,于是就有了汇编代码


输入

gcc -S test.i -o test.s

输出
在这里插入图片描述

此时我们可以发现已经生成了后缀名为.s的文件,那么我们现在用vim编辑器来打开试试看,我们看看里面到底存放了什么东西。我们输入vim test.s

在这里插入图片描述

是不是很熟悉,相信用过vs的小伙伴都知道这是生成的汇编代码。
在这里插入图片描述

⏳汇编(生成可执行文件或库文件)

汇编阶段是把编译阶段生成的“.s”文件转成目标文件(.obj)
读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
实例: gcc –c hello.s –o hello.o


输入

gcc -c test.s -o test.o

输出
哈哈哈哈我们会发现这是一些我们都看不懂的东西对不对呢,没错这些东西尊嘟很难看懂,这都是给电脑看的,电脑能识别就行啦!
在这里插入图片描述

⏳连接(生成可执行文件或库文件)

在成功编译之后,就进入了链接阶段。 实例: gcc hello.o –o hello

在所有的概念中,还有一种叫动静态库的概念,我们可以试想一下,我们就随便的包一个头文件难道就可以编译这些东西了吗。其实在下载软件的时候都已经帮你们下载好啦,我现在用的是云服务器,所以连接的是动态库。


举例说明

输入

gcc test.o -o test

输出
在这里插入图片描述

这里生成了一个可执行文件。我们怎么知道他是可执行文件呢?在我写的权限篇有讲噢,不记得的自己再去看看啦!

之后我们就可以直接执行该文件啦!


⏳函数库


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

最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用;


⏳函数库一般分为静态库和动态库两种

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

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

gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证。


⏳gcc指令选项

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

在这里插入图片描述

📃如何巩固学习

提示:在学习的过程中,我们需要先自行进行思考,并且多去阅读一些大佬的书籍,俗话说的好,书籍是人类进步的阶梯!

📃本文小结

好啦今日的分享到这里就结束啦,我是爱你们的M malloc希望可以帮助到你们噢,最后别忘记三连啦!!

在这里插入图片描述

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

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

相关文章

Tessy 5.0.4

Tessy 5.0.4 Linux 2692407267qq.com,更多内容请见http://user.qzone.qq.com/2692407267/

改写句子软件有哪些?改写句子软件排行榜

什么是改写句子软件?这些软件是基于自然语言处理技术的应用,它们可以接受一段文字,并将其重新表达成具有相同或类似意义的内容,但使用不同的词汇和结构。改写句子软件的出现,使得在不改变原始含义的情况下,能够更轻松…

MFC 如何调用wkhtmltopdf实现html转换pdf

一、wkhtmltopdf下载 1、wkhtmltopdf官网:https://wkhtmltopdf.org/ 2、我的资源里面下载:https://download.csdn.net/download/my_angle2016/88368461?spm1001.2014.3001.5503 二、wkhtmltopdf安装 1、双击wkhtmltox-0.12.6-1.msvc2015-win32.exe&…

人工智能的前世今生与未来

人工智能的前世今生与未来 一、 什么是人工智能二、人工智能的前世三、人工智能的今生四、人工智能的未来 一、 什么是人工智能 人工智能(Artificial Intelligence,简称AI)是指一种模拟人类智能行为的科学与技术。 人工智能通过计算机系统进…

华为云云耀云服务器L实例评测|netdata的部署与应用

大家好,我是雄雄,欢迎关注微信公众号:雄雄的小课堂 看这里 前言何为netdata安装 前言 前两天,给大家介绍了下关于使用华为云云耀云服务器L实例做了几个案例应用,分别为: 华为云云耀云服务器L实例评测|一个…

【无标题】C语言学习笔记5--循环结构和选择结构

5.1 运算符和运算符 5.1.1逻辑运算发 运算符说明结核性举例&&与运算,双目,对应数学中的“且”左结合1&&0、(9>3)&&(b>a与运算,双目,对应数学中的“且”左结合1!非运算,单目&#xff0…

你知道 delete 删除属性时的一些细节吗?

探究 delete 的一些细节,起源于刚刚做过的一道笔试,原题如下: a 1; const b 2; console.log(delete a); console.log(delete b); // 输出结果是? // 答:true false我可从来没用过 delete 的返回值,但凡…

Reat 中的 useImperativeHandle 钩子函数

通过例子说明 ref 的不足 当我们需要调用子组件中的方法时&#xff0c;我们都是考虑使用useRef来调用子组件的方法&#xff0c;具体的示例代码如下&#xff1a; // 父级组件 const UseImperativeHandleDemo: React.FC () > {const inputRef useRef<HTMLInputElement&…

Linux忘记密码

在虚拟机安装了centOS7&#xff0c;但是忘记了root密码&#xff0c;登录的时候发现登录不上了&#xff0c;然后重新修改密码。 1、重启虚拟机 2、进入到该页面之后&#xff0c;选中第一个&#xff08;高亮显示即为选中&#xff09;选项&#xff0c;然后按下键盘的“E”键 3…

每日一题 1993. 树上的操作

难度&#xff1a;中等 思路&#xff1a; 首先为了更好的访问每个节点的子节点&#xff0c;我们创建一个字典来表示key节点下的所有子节点&#xff0c;其次上锁&#xff0c;解锁不用多说升级过程&#xff0c;对于条件一和三可以理解为同一个&#xff0c;即包括它本身在内的所有…

基于springboot+vue的大学生竞赛交流系统(前后端分离)

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战 主要内容&#xff1a;毕业设计(Javaweb项目|小程序等)、简历模板、学习资料、面试题库、技术咨询 文末联系获取 项目介绍…

人工智能机器学习-飞桨神经网络与深度学习

飞桨神经网络与深度学习-机器学习 目录 飞桨神经网络与深度学习-机器学习 1.机器学习概述 2.机器学习实践五要素 2.1.数据 2.2.模型 2.3.学习准则 2.4.优化算法 2.5.评估标准 3.实现简单的线性回归模型 3.1.数据集构建 3.2.模型构建 3.3.损失函数 3.4.模型优化 3…

Vue的进阶使用--模板语法应用拓展(表单及组件通信)

目录 ​编辑 一.事件处理器 1.监听事件 1.1首先定义监听事件&#xff0c;并定义调用的方法 1.2编写调用的方法 案例演示 1.编写HTML层 2.编写方法 2.Vue.js阻止重复请求 2.1模拟请求操作 2.2 测试结果及结论 二.表单验证 1.基础表单验证 1.1 HTML层 1.2JS层 …

数字经济水平测算(内含4种版本2种方式)-地级市(2011-2021年)

参照赵涛等&#xff08;2020&#xff09;的文章&#xff0c;利用熵值法和主成分对城市数字经济水平进行测算&#xff0c;包括原始数据及测算结果。内含4种版本2种方式&#xff0c;在8种情况下测算的数字经济水平。 一、数据介绍 数据名称&#xff1a;地级市-数字经济水平测算…

栈的简单应用(利用Stack进行四则混合运算)(JAVA)

目录 中缀表达式转后缀表达式 图解 代码实现过程&#xff1a; 完整代码&#xff1a; 利用后缀表达式求值&#xff1a; 完整代码&#xff1a; 首先我们得先了解逆波兰表达式。 中缀表达式转后缀表达式 所谓的中缀表达式其实就是我们平时写的例如&#xff1a;&#xff1…

基于SpringBoot的墙绘产品展示交易平台设计与实现

目录 前言 一、技术栈 二、系统功能介绍 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本墙绘产…

生活垃圾数据集(YOLO版)

文章目录 1、数据集介绍1.1、数据集图片组成2.1、获取数据集方式 2、扩展代码2.1、文件结构树2.2、划分数据集2.3、获取数据集文件名字2.4、文件成功对应检测 3、其他文章 1、数据集介绍 1.1、数据集图片组成 【有害垃圾】&#xff1a;电池&#xff08;1 号、2 号、5 号&…

TensorFlow安装 ,在原本的虚拟环境下配置Tensorflow.

1.TensorFlow安装 &#xff0c;在原本的虚拟环境下配置Tensorflowh和pytorch 2.我首先在anaconda的环境下创建了一个tensorflow文件夹 如何先进入D盘&#xff0c;再进入tensorflow文件夹的目录D:cd D:\Anaconda\TensorFlowSoftWarepip install tensorflow如图所示报错解决方法 …

软件设计师考试学习2

数据结构与算法基础 数组 稀疏矩阵 用代入法计算&#xff0c;A 数据结构的定义 非线性结构分为树和图&#xff0c;区别在于有没有环路 顺序表与链表 引入头节点可以使所有的节点处理方式一致 如果没有空的头节点&#xff0c;头节点需要单独处理 顺序存储与链式存储 查找…

文件操作(2)

目录 文件操作的步骤&#xff1a; 流&#xff1a; 标准流&#xff1a; 文件指针&#xff1a; 文件信息区&#xff1a; 概念&#xff1a; 关系转化&#xff1a; 注意&#xff1a; 文件指针&#xff1a; 文件的打开和关闭&#xff1a; 打开方式&#xff1a; 打开成…