⭐️【linux】关于linux-gcc,你必须要知道的知识

news2025/1/15 19:41:51

🌲🌲目录🌲🌲

1️⃣什么是gcc

2️⃣gcc如何生成可执行文件

3️⃣简单使用gcc

4️⃣linux的库


1️⃣什么是gcc

❄️GCC(GNU Compiler Collection,GNU编译器套件),是由 GNU 开发的编程语言编译器。它是以GPL许可证所发行的自由软件,也是 GNU计划的关键部分。

❄️GCC原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统(如Linux、BSD、Mac OS X等)采纳为标准的编译器,GCC同样适用于微软的Windows。

❄️gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。

❄️Gcc编译器能将C、C++语言源程序、汇程式化序和目标程序编译、连接成可执行文件,如果没有给出可执行文件的名字,gcc将生成一个名为a.out的文件。

❄️在Linux系统中,可执行文件没有统一的后缀,系统从文件的属性来区分可执行文件和不可执行文件。而gcc则通过后缀来区别输入文件的类别。

2️⃣gcc如何生成可执行文件

在我们初学编程时,我们所用的都是IDE,不需要我们去分别执行编译的步骤,我们只管写自己的代码,点击运行就可以了,系统会自动生成可执行文件去执行。但是你还是必须要知道整个编译的过程。不管是gcc还是ide,都缺省不了这四个过程😏。

🌼预处理:在此阶段,编译器会展开头文件,删除注释,进行宏替换和条件编译。生成.i为后缀的文件。 

🌼编译:检查语法,生成以汇编代码形成的.s文件

🌼汇编:生成以二进制代码形成的.o文件

🌼链接:将库函数和目标代码连接起来,生成可执行程序。

🌊gcc首先调用cpp进行预处理,在预处理过程中,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译,这个阶段将预处理得到的源代码文件,进行“翻译转换”,产生出机器语言的目标程序,得到机器语言的汇编文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是链接。在链接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的库中链到合适的地方。

3️⃣简单使用gcc

💫使用格式:gcc  [选项]  [要编译的文件]  [选项]  [目标文件]

-E只预编译,不做任何处理
-c只编译不链接,生成目标文件”.o”
-S

只编译不会汇编,生成汇编代码”.s”

-o 指定将file文件作为输出文件

预处理:

编译:

 

汇编: 

链接: 

 省略前面的步骤,如何直接生成可执行文件?

 

直接用【gcc filename -o 目标文件】就可以啦😘!!

日常一问😳如何查看生成的文件是否已经被链接?即是否已经是可独立执行的文件呢?

我们用到了ldd

什么是ldd?

ldd用来打印或者查看程序运行所需的共享库(访问共享对象依赖关系)。

 表示我们makefile这个可执行文件依赖于c语言库,这就表示makefile文件已经是被链接过了,.so表示这个库是动态库,.6是版本👍。

如果一个文件没有被链接,那么我们ldd file 会出现什么情况呢?

 😇你看,这就表示我们没有权限去执行这个.c文件,并且它不是一个动态可执行的文件,也就是说明没有被链接。

4️⃣linux的库

linux的库分为两种,分别为静态库动态库,并且库的本质也是文件,毕竟linux下一切皆文件。

  • 静态库:libXXXX.a
  • 动态库:libXXXX.so

我们安装的vs2022也好,vs2019也好,其中最重要的就是下载并安装语言的头文件库文件!我们用的指令,有相当一部分是用C写的,那么我们应该如何看待指令呢❓其实吧,指令就是程序,是工具。

🌑静态库链接找到静态库,拷贝静态库中我所需要的代码到我自己的可执行程序中;

🌒动态库链接找到动态库,拷贝动态库中我所需要的代码的地址到我自己的可执行程序中的相关位置;

🌓静态链接成功我们的程序,不依赖任何库,自己就可以独立运行;

🌘动态链接成功我们的程序,依然依赖动态库,一旦动态库缺失,我们的程序便无法运行;

🌜动静态库链接的优劣

静态库是拷贝过去的,不依赖链接成功之后的任何库,但是浪费空间,增加了没必要的开销;

动态库是拷贝过去的地址,空间开销较小,但是一旦静态库缺省,程序就无法正常运行;

🔥注:linux默认使用的是动态链接和动态库!

如何查看一个文件是动态链接还是静态链接?------------file  !

什么是file?:

file 命令用来识别文件类型。对文件的检查分为文件系统、魔数检查和语言检查三个过程,也可用来辨别一些文件的编码格式。它是通过查看文件的头部信息来获取文件类型,而不是像 Windows 通过扩展名来辨识文件类型。

 如图所示,file + 文件名,观察出makefile这个可执行文件是dynamically linked,即动态链接的。

如何强制linux静态链接一个可执行文件呢?

如图所示, 我们用【gcc 源文件名 -o 可执行文件名  -static】强制linxu系统静态链接生成了一个可执行文件,并且我们用file也查看到了它的静态链接属性。

linux系统:你最好有事!😈

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

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

相关文章

Java 中 Map 集合的基本使用

一、HashMap 1.1 HashMap 基本使用 import java.util.*;/*** author: yunhu* date: 2022/7/14*/ public class Test {public static void main(String[] args) {Map<String, Integer> map new HashMap<>();map.put("Alice", 12);map.put("Bob&qu…

62.Python 类的3要素语法

62.类的3要素语法 文章目录62.类的3要素语法1. 定义类的语法2. pass语句的作用3.我们学的5个缩进语法4.类的属性5.类的方法6. 创建对象7.类在爬虫中的应用8. 总结1. 定义类的语法 定义类的语法如下&#xff1a; class 类名: 代码块 从语法上来看&#xff1a;类的…

Edify Script (Android Shell)定制Twrp刷机包

本文将通过三方面向大家介绍Edify Script,相信你看完了这篇文章会对安卓系统可刷写插件有一个比较完整的认识,并且能过通过阅读此文章实现使用twrp刷入自己写的插件zipi包。网上能搜到的大部分是旧的,新版本去掉了很多的edify函数,照着他们那个写多半会报错。 本文分为如下…

LeetCode学习-第三十八天

第三十八天 我使用的C&#xff0c;错误的地方请见谅&#xff0c;文章初衷仅用来督促本人学习&#xff0c;如果恰巧能够给你带来帮助&#xff0c;我会十分开心。 文章目录第三十八天一、537. 复数乘法二、29. 两数相除一、537. 复数乘法 复数 可以用字符串表示&#xff0c;遵循…

CentOS7如何修改IP地址及UUID

CentOS7系统下&#xff0c;如果要把IP地址修改为192.168.1.80&#xff0c;子网掩码是255.255.255.0&#xff0c;网关是192.168.1.1&#xff0c;DNS是192.168.1.1&#xff0c;那么我们使用客户端连接CentOS或者打开系统终端&#xff0c;切换到root用户&#xff0c;命令&#xff…

开料的目的和子流程,一文读懂

经过多个月的分享&#xff0c;关于PCB行业&#xff0c;想必朋友们已经有了一些个人的理解&#xff0c;甚至对PCB行业&#xff0c;还产生了浓厚的兴趣。 但是&#xff0c;PCB生产工艺是非常复杂的&#xff0c;想要深入地学习并且学好PCB生产工艺&#xff0c;假如不在PCB的生产一…

如何从PyTorch中获取过程特征图

一、获取Tensor 神经网络在运算过程中实际上是以Tensor为格式进行计算的&#xff0c;我们只需稍稍改动一下forward函数即可从运算过程中抓到Tensor 代码如下&#xff1a; base_feature self.extractor.forward(x) #正常的前向传递 featurebase_feature.detach() …

JavaScript 数据类型

文章目录JavaScript 数据类型JavaScript 拥有动态类型JavaScript 字符串JavaScript 数字JavaScript 布尔JavaScript 数组JavaScript 对象Undefined 和 Null声明变量类型JavaScript 数据类型 字符串&#xff08;String&#xff09;、数字(Number)、布尔(Boolean)、数组(Array)、…

基于java eclipse+jsp+mysql+servlet+Spring的学生信息管理系统基础版

基于java eclipsejspmysqlservletSpring的学生信息管理系统基础版 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言…

【Python百日进阶-数据分析】Day148 - plotly直方图:px.histogram()

文章目录四、实例4.1 带有 Plotly Express 的直方图4.1.1 基本直方图4.1.2 使用一个包含分类数据的列4.1.3 选择方箱的数量4.1.4 日期数据直方图4.1.5 分类数据的直方图4.1.6 访问计数&#xff08;y 轴&#xff09;值4.1.7 标准化类型4.1.8 直方图的外观4.1.9 一列不同值的几个…

MySQL基础篇第10章(创建和管理表)

1. 基础知识 1.1 一条数据存储的过程 存储数据是处理数据的第一步 。只有正确地把数据存储起来&#xff0c;我们才能进行有效的处理和分析。否则&#xff0c;只 能是一团乱麻&#xff0c;无从下手。 那么&#xff0c;怎样才能把用户各种经营相关的、纷繁复杂的数据&#xff…

npm 包 chalk-next 被开发者投毒,源码 SRC 目录被删除

一、事件简述 1月5日&#xff0c;有开发者在 twitter 中发文称遭遇了名为 chalk-next 的组件投毒事件&#xff0c;该组件存在收集配置信息和删除本地文件的恶意逻辑&#xff0c;当前 NPM 仓库已经下线了该组件。 chalk-next 组件的开发者也是 vue-admin-beautiful 项目的作者 …

配对交易策略设计

可交易的一个关键要求是两个股票的对数价格序列之间存在均衡关系。 而均衡关系由两个值描述&#xff1a;协整系数以及均衡值。一旦确定这两个值&#xff0c;它们就可以用来构建两种股票的对数价格的线性组合&#xff0c;即所谓的价差。配对交易是对价差均值回归特性的押注。当…

Gigabyte B450 Aorus Elite AMD Ryzen 5 3600电脑 Hackintosh 黑苹果efi引导文件

硬件型号驱动情况主板Gigabyte B450 Aorus Elite处理器AMD Ryzen 5 3600已驱动内存16GB Samsung DDR3 1600MHz已驱动硬盘Samsung 840 Evo 250GB已驱动显卡AMD Radeon RX570 4gb已驱动声卡Realtek ALC892已驱动网卡Realtek 8111G已驱动无线网卡蓝牙Asus AX3000 Dual Band PCI-E …

(一)云原生基础概念-容器-Kubernets

文章目录云原生云原生历程云原生技术范畴云原生与传统部署云原生关键技术传统vs微服务vsServerlessServerless容器分层复用模式容器运行构建镜像容器引擎架构-moby容器和VM之间的差异Kubernetes调度自动恢复水平伸缩总架构Master架构Node架构Pod一个kubernet架构VolumeDeployme…

【计组】GPU--《深入浅出计算机组成原理》(六)

​课程链接&#xff1a;深入浅出计算机组成原理_组成原理_计算机基础-极客时间 GPU 是随着计算机里面需要渲染三维图形的出现&#xff0c;而发展起来的设备。 一、GPU和图形渲染 完整的5 个步骤的渲染流程一般也被称为图形流水线&#xff08;Graphic Pipeline&#xff09; …

SREWorks v1.4 版本发布 | 离线安装 前端重构

在 v1.3 版本之后&#xff0c;SREWorks 团队收集了较多的用户反馈&#xff0c;大家普遍对于 SREWorks 的内网离线安装有较大的诉求。于是团队决定进一步增强这部分的安装能力。 前端工程部分 (frontend)&#xff0c;为了开发者更加敏捷高效的协作开发&#xff0c;以及便于社区…

web(一)—— HTML基础(web标准、开发工具、标签)

目标能够理解HTML的 基本语法 和标签的关系 能够使用 排版标签 实现网页中标题、段落等效果 能够使用 相对路径 选择不同目录下的文件 能够使用 媒体标签 在网页中显示图片、播放音频和视频 能够使用 链接标签 实现页面跳转功能一、基础认知目标&#xff1a;认识 网页组成 和 五…

vite使用css的各种功能

1.使用公共的变量(:root)定义在root的变量可以进行类的使用 :root { font-size: 160px;--main-bg-color:red } .red{color:var(--main-bg-color) }你看这个hello world变得多大多红 2.vite使用postcss-plugins/console’ 2-1安装&#xff1a;cnpm install postcss-plugins/co…

最大公约数-欧几里得算法

最近在复习数论&#xff0c;欢迎来到数论的起点gcd 最大公因数&#xff0c;也称最大公约数、最大公因子&#xff0c;指两个或多个整数共有约数中最大的一个。 欧几里得算法&#xff08;辗转相除法&#xff09; 已知两个数a和b&#xff0c;求出两数的最大公约数首先证明: 不妨…