从0开始linux(6)——gcc

news2024/10/8 10:33:28

欢迎来到博主的专栏:从0开始linux
博主ID:代码小豪、

文章目录

    • gcc
    • gcc的文件风格
    • 预处理
    • 编译
    • 汇编
    • 链接

gcc

gcc是linux系统下常用的C语言编译器,随着后续的扩展,gcc支持了c++,并推出了g++编译器,现在的gcc可以支持多种编程语言,称为gnu编程套件。

关于gcc的历史不多赘述,gcc是linux系统下常用的C语言编译器。

gcc的文件风格

有个耳熟能详的梗是这么说的:“txt是世界上最好的C语言编程工具”,这是因为将文本文件的.txt后缀改成.c,就能被C语言编译器编译。这说明了C语言的源文件(.c)和头文件(.h)与普通文件之间并没有区别。

gcc对文件的规则为:
.c:c语言源文件
.h:c语言头文件
.a:静态库(类似于.lib文件)
.so:动态库(类似于.dll文件)

预处理

一个源文件到生成可执行程序需要四步:为预处理,汇编,编译,链接。这是每个C语言初学者都知道的东西,但是由于现在的主流IDEA是visual studio。因此虽然知道这四个步骤,但是对这些细节并没有非常了解。

预处理的功能有:

  • 宏替换
  • 处理条件编译
  • 展开头文件
  • 去掉注释

比如我们写如下的一个code.c文件。
在这里插入图片描述
gcc对源文件进行预处理的指令为:gcc -E [filename] [option]

比如,我们要将code.c进行预处理,并将预处理的结果生成为code.i文件

gcc -E code.c -o code.i

-E命令是指对后面源文件进行预处理,-o命令的意思则是制定生成文件的名称,比如上面就是将code.c的预处理结果命名为code.i。

-o指令并非必须,如果没有-o指令,则默认情况下会将预处理的结果打印在屏幕上。

我们打开code.i文件,可以发现源文件的预处理结果依然是一个文本文件,只是和源文件相比,有所改变。
在这里插入图片描述
在这里插入图片描述

编译

第二步叫做编译,是将预处理文件转成汇编语言的汇编语言文件,后缀名为.s。使用gcc对预处理文件进行编译的指令为:
gcc -S [file.i]

如果要将code,i文件编译成code.s文件,指令如下:

gcc -S code.i -o code.s

我们打开一下code.s文件。如下:
在这里插入图片描述

可以发现,到源文件经过编译这一步骤的时候,就不再是我们所熟悉的C语言语法了,而是一个由汇编语言所写的代码文件。因此编译的作用其实是将一个C语言文件翻译成汇编语言的操作。

在这里插入图片描述

汇编

第三步操作叫做汇编,其作用是将汇编文件翻译成二进制文件。指令如下:
gcc -c [filename.s]

那么将汇编文件code.s,进行汇编操作的指令如下:

gcc -c code.s -o code.o

我们打开这个code.o文件,如下:
在这里插入图片描述
二进制文件已经不是我们能看懂的文件了,因为二进制语言并非人类的语言,而是机器的语言,汇编操作的作用就是将汇编文件翻译成二进制文件。让计算机读懂这些指令,并执行对应操作。
在这里插入图片描述

链接

最后一步叫做链接,所谓的链接是什么呢?还记得我们一开始就包含的头文件<stdio.h>吗?我们的源文件中,使用了printf函数,但是code.c当中并没有“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?

通过ldd命令,会列出一个可执行程序所链接的库。其格式为:ldd filename
在这里插入图片描述

printf的实现放在了 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。

链接分为两种,称为动态链接和静态链接,动态链接的库称为动态库,文件名后缀为.so,静态链接的库称为静态库,文件名后缀为.a。而上图中的可执行程序code显然是动态链接到动态库的。那么动态链接和静态链接的原理有什么不同呢?

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

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

优点缺点
动态库节省空间一旦动态库出现错误,与动态库链接的可执行程序都会失效
静态库可执行程序的状态不依赖静态库空间开销比动态链接多

我们可以尝试用静态链接的方式编译code.o。静态编译的指令为:gcc file.o -static

gcc code.s -o code_static -static

在这里插入图片描述
动态链接的可执行文件只有8000b,而静态链接的可执行文件多达800000b。所以说动态链接是更常用的链接方式。因为性能是在是好太多了。

在这里插入图片描述

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

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

相关文章

C++(异常)

目录 C语言传统的处理错误的方式 传统的错误处理机制 C异常概念 异常的使用 异常的抛出和捕获 异常的抛出和匹配原则 在函数调用链中异常栈展开匹配原则 异常的重新抛出 异常安全 异常规范 自定义异常体系 C标准库的异常体系 异常的优缺点 C异常的优点 C异常的缺…

基于Python的美术馆预约系统【附源码】

效果如下&#xff1a; 系统首页界面 系统注册页面 美术馆详细页面 公告信息详细页面 后台登录界面 管理员主界面 美术馆管理界面 预约参观管理界面 研究背景 随着文化娱乐活动的日益丰富&#xff0c;美术馆作为展示艺术作品、传播文化的重要场所&#xff0c;其管理和服务模式…

大语言模型入门(四)——检索增强生成(RAG)

一、什么是检索增强生成 检索增强生成&#xff08;Retrieval-Augmented Generation&#xff0c;RAG&#xff09;由Facebook AI Research&#xff08;FAIR&#xff09;团队于2020年首次提出&#xff0c;这是一种结合了信息检索技术与语言生成模型的人工智能技术。它通过从外部知…

局域网内探测在线好友是如何做到的?

一、前言 随着局域网&#xff08;LAN&#xff09;应用的广泛使用&#xff0c;网络通信已经成为软件设计中不可或缺的一部分。局域网聊天软件作为一种常见的网络应用&#xff0c;可以实现多个用户之间的实时通信&#xff0c;广泛应用于企业内部沟通和小型网络环境中。本项目设计…

‌视频尺寸修改与批量剪辑技巧

在当今这个数字化时代&#xff0c;视频内容已成为人们获取信息、娱乐和社交的重要方式。然而&#xff0c;面对海量的视频素材&#xff0c;如何高效地管理和编辑它们成为了一个挑战。 1打开视频剪辑高手软件&#xff0c;切换功能到“批量剪辑视频” 2把需要剪辑的视频导入到表格…

希尔排序和直接插入排序

因为排序这些比较复杂点我就分几期给大家来讲~~~ 直接插入排序 直接插入排序是一种简单的排序算法&#xff0c;主要用于对少量数据进行排序。其基本思想是将待排序的元素逐个插入到已经排好序的部分中&#xff0c;从而形成一个有序序列。 具体步骤如下&#xff1a; 初始化&…

基于32单片机的博物馆安全监控系统设计

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 检测 分别是温湿度 光照 PM2.5、烟雾、红外&#xff0c;然后用OLED屏幕显示&#xff0c; 红外超过阈值则蜂鸣器报警&#xff0c;这是防盗报警&#xff1b;温度或烟雾超过阈值&#xff0c;则蜂鸣器…

【目标检测】木制地板缺陷破损数据集338张6类VOC+YOLO格式

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;3383 标注数量(xml文件个数)&#xff1a;3383 标注数量(txt文件个数)&#xff1a;3383 标注…

fiddler抓包21_(性能测试)耗时分析

课程大纲 使用场景 1. 查看请求耗时。 2. &#xff08;更多&#xff09;前端性能分析、优化。 1. 查看单个请求耗时 耗时详情&#xff1a;选择请求 - 右侧标签菜单选择Statistics“请求统计”。 传输时间线&#xff1a;选择请求 - 右侧选择“TimeLine”。 2. 前端性能分析&a…

MYSQL 常见锁机制详解,常见锁问题排查及分析

1&#xff0c;锁分类 锁冲突是影响数据库性能的重要指标&#xff0c;本章节介绍MYSQL常见锁&#xff0c;及各种说的常用示例&#xff0c;mysql锁的分类如下&#xff1a; 从操作类型分类&#xff1a;读锁、写锁&#xff1b; 从操作粒度分类&#xff1a;表锁、页锁、行锁&#x…

【文献阅读】Transfer Learning For Text Classification Via Model Risk Analysis

前言&#xff1a;本文是以文本分类的迁移学习任务为例&#xff0c;对风险分析模型的整体框架流程做梳理。 目录 1. LearnRisk1.1 motivatio1.2 overall 2. LearnRisk-TC2.1 构造风险特征2.1.1 risk metric2.1.2 risk feature 2.2 构建风险模型2.3 训练风险模型2.4 微调base mod…

线性代数入门

线性代数入门 线性代数&#xff08;Linear Algebra&#xff09;是数学的重要分支之一&#xff0c;广泛应用于工程、计算机科学、物理学、经济学等领域。它主要研究向量、矩阵及其在空间中的变换。对于程序员来说&#xff0c;掌握线性代数的基础知识能够帮助更好地理解数据处理…

边缘人工智能(Edge Intelligence)

边缘人工智能&#xff08;Edge AI&#xff09;是指在边缘设备上直接运行人工智能&#xff08;AI&#xff09;和机器学习&#xff08;ML&#xff09;算法的技术。机器学习是一个广泛的领域&#xff0c;近年来取得了巨大的进步。它所基于的原则是&#xff0c;计算机可以通过从数据…

Qt-QGridLayout布局类控件(43)

目录 描述 属性 使用 常规使用 垂直布局 水平布局 布局是按照相对大小进行的 拉伸系数 使用 设置水平拉伸系数 设置垂直拉伸系数 描述 Qt 中还提供了 QGridLayout ⽤来实现⽹格布局的效果.可以达到 M * N的这种⽹格的效果 属性 layoutLeftMargin左侧边距layoutRig…

Windows 安装 Maven 并配置环境变量

一、简介 Maven 是一款基于 Java 平台的项目管理和整合工具&#xff0c;用来构建项目的。也就是清理、编译、测试、运行、打包、安装整个过程都交给 Maven 管理&#xff0c;整个过程就是构建。 二、安装 Java JDK Maven 依赖 Java JDK&#xff0c;如果本机没有安装过 Java 的…

NASA:第三版大气痕量分子光谱(ATMOS)2 级产品,包含垂直高度(千米)网格上的痕量气体

目录 简介 摘要 代码 引用 网址推荐 0代码在线构建地图应用 机器学习 ATMOS L2 Trace Gases on Altitude Grid, Fixed Field Format V3 (ATMOSL2AF) at GES DISC 简介 高度网格上的 ATMOS L2 跟踪气体&#xff0c;固定字段格式 V3 (ATMOSL2AF) 这是第三版大气痕量分子…

CMake学习笔记:项目的导出和安装-install命令

一、基本语法与概念 1.文件的安装 install(FILES) 用Poco库 usr/local/poco/CMakeLists.txt中内容 举例如下&#xff1a; 2.目标安装 install(TARGETS) 3.导出目标与导出配置文件 将目标mylib导出名为MyModules的目标。MyModules导出目标包含了关于mylib的所有信息&#xf…

【初阶数据结构】冒泡排序和选择排序(用C语言实现,主要讲思维)

文章目录 前言1. 冒泡排序1.1 算法思想1.2 冒泡排序的代码实现1.3 冒泡排序算法的改进 2. 选择排序2.1 算法思想2.2 选择排序的代码实现 3. 写排序算法的小技巧 前言 讲到排序相信大家一定对一种排序很熟悉&#xff0c;它的名字就叫做冒泡排序。这个排序大家在学习各种语言时&…

【优选算法】(第二十六篇)

目录 两数相加&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 两两交换链表中的节点&#xff08;medium&#xff09; 题目解析 讲解算法原理 编写代码 两数相加&#xff08;medium&#xff09; 题目解析 1.题目链接&#xff1a;. - 力扣&#xff08;…

随着硬件水平的提升,LabVIEW有哪些过去的编程方法被淘汰掉了

随着硬件水平的不断提升&#xff0c;尤其是处理器性能、存储能力、通信速度等方面的飞跃&#xff0c;LabVIEW的一些早期编程方法逐渐被更高效、现代的编程技术所取代。以下是一些随着硬件升级而逐步淘汰的LabVIEW编程方法和技术&#xff1a; 1. 低效的数据流传输方式 过去由于…