当前位置: 首页 > news >正文

Linux编译器-gcc或g++的使用

一.安装gcc/g++

在linux中是不会自带gcc/g++的,我们需要编译程序就自己需要安装gcc/g++。

很简单我们使用简单的命令安装gcc:sudo yum install -y gcc

g++安装:sudo yum install -y gcc-c++

我们知道Windows上区分文件,都是使用文件后缀来区分的,.txt是文本文件,.mp4是视频文件,.md是markdown文件等等。

在linux中一切皆文件,一个文件可以随便取名字,但是这样好吗?不见得。比如下面这样。

image-20240606150226762

test.txt文件中我编写的是c代码,使用gcc编译器编译该文件,显然从结果来看,是编译不过的。

使用mv修改test.txt为test.c,再使用gcc编译就能编译过了。

image-20240606150515492

结论:虽然linux中不关心文件的后缀,但是gcc/g++是要区分文件后缀的,gcc编译.c后缀的c文件,g++编译.cc/.cpp后缀的c++文件。

二.一个文件到可执行程序的步骤

在我们编一个源文件的时候,使用gcc或者g++时,都会直接生成可执行程序。
那为什么要生成可执行程序呢?因为机器只认识二进制语言,它可不懂什么代码,汇编,我们的目的就是把源代码变成机器语言,也就是二进制语言。

其实生成可执行程序之前都会有好几个步骤的:

先经过预处理,再编译,在汇编,在进行链接生成可执行程序,接下来我们就一步一步探讨一下具体步骤的作用。

1.预处理

预处理的主要功能:

①头文件的展开
②去注释
③条件编译
④宏替换

预处理的命令:gcc -E test.c -o test.i

这里的-E就是预处理的意思,-o是生成test.i文件。

编写代码来验证一下。

 #include<stdio.h>2 #define M 103 4 #define v1 15 int main()6 {7     //这是条件编译                                                          8 #if v19     printf("这是普通版本的\n");10 #elif v211     printf("这是会员版本的\n");12 #else13     printf("这是超级会员版本的\n");14 #endif15   printf("%d",M);18     return 0;19 }

image-20240606155315253

可以看出上面几百行全是stdio头文件的展开,然后我们写的注销也全部没有了,定义的宏M也被替换成了10,条件编译也成功的实现了,通过条件编译,可以实现对代码的动态裁剪

2.编译

编译就是把预处理后的文件生成汇编的过程。

编译的命令:gcc -S test.i -o test.s

验证:

image-20240606155436535

可以看出这里就是各种汇编的指令,我们也看不懂。

3.汇编

汇编也就是把汇编语言变成二进制语言。

汇编的命令:gcc -c test.s -o test.o

image-20240606160417442

这就是可被机器识别的目标文件(obj文件)。

4.链接

链接就是生成可执行程序。

链接命令:gcc test.o

链接可不是这么简单就完了,它还牵扯到库文件,待会细说。

三.gcc选项记忆

上面我们说到预处理,编译等,使用的命令是不是不好记,这里有个好记忆的方法。

使用的命令-E -S -c刚好对于键盘上的键ESC,只不过要记清楚,ES是大写,c是小写的。

依次生成的文件是iso,而在Windows中,iso是光盘镜像文件。

这样联系起来也就比较好记了。

但是我们实际上我们得到可执行文件,可不用这么复杂,直接使用gcc该文件即可。

四.函数库之静态库和动态库

对于printf函数这些,为什么我们代码中写了,电脑就知道它实现的是什么功能呢?

因为我们包含了头文件?也不全对,因为stdio头文件只是各种声明,还有各种宏定义而已。

我们现在所写的代码都是站在巨人的肩膀上,已经有人帮我们写好了可以直接可以使用的函数,也就是函数的实现,那这些函数在哪里呢?我怎么没有看到。

这就要引出来我们要说的库了,库包含各种函数的实现。

可执行程序=我们写的代码+头文件+库。

使用命令ls /lib64/libc.so.6可以查看库的位置。

image-20240606171237816

而库也分为静态库和动态库。默认情况下,云服务器上是没有安装c静态库的,只有动态库。

一般来说,linux中.so为动态库,Windows中.dll为动态库。

linux中.a为静态库,Windows中.lib为静态库。

安装c++静态库的命令:sudo yum install -y libstdc+±static。
安装c静态库的命令:sudo yum install -y glibc-static。

动态库是c/c++或者其他第三方提供的所有方法的集合,被所有程序以链接的方式关联起来。(动态链接)

这里的动态链接是库中所有的函数,都有入口地址,所谓的动态链接,其实就是把要连接的库中的函数地址拷贝到我们的可执行程序的特定位置!

静态库是c/c++或者其他第三方提供的所有方法的集合,被所有程序以拷贝的方式,将需要的代码,拷贝到自己的可执行程序中。(静态链接)

我们可以将test.文件分别使用静态链接和动态链接得到可执行程序,来看看有什么区别。

动态链接:

image-20240606184328750

静态链接:

image-20240606185725454

test-d是动态链接出来的可执行文件,而test-s是静态链接出来的可执行文件,可以很清晰的看出,静态链接出来的可执行程序的文件大小是远大于动态链接的。

这里就可以总结出它们的优缺点了。

动态链接的优点:形成的可执行程序体积较小,比较节省资源的!
缺点:强依赖动态库,动态库没了,所有的依赖这个库程序都无法运行了。

静态库的优点:无视库,可以独立运行。
缺点:体积太大,浪费资源。

就像刚开始我们下载vs开发环境的时候,下载安装包内存不大,当我们选择c/c++下载得到时候,大小就会达到几个G。
这是因为当我们下载的开发环境的时候,它默认会为我们做以下工作:

①下载头文件,lib。
②设置合理的查找路径。

相关文章:

Linux编译器-gcc或g++的使用

一.安装gcc/g 在linux中是不会自带gcc/g的&#xff0c;我们需要编译程序就自己需要安装gcc/g。 很简单我们使用简单的命令安装gcc&#xff1a;sudo yum install -y gcc。 g安装&#xff1a;sudo yum install -y gcc-c。 我们知道Windows上区分文件&#xff0c;都是使用文件…...

一条sql的执行流程

文章地址 https://blog.csdn.net/qq_43618881/article/details/118657040 连接器 请求先走到连接器&#xff0c;与客户端建立连接、获取权限、维持和管理连接 mysql缓存池 如果要查找的数据直接在mysql缓存池里面就直接返回数据 分析器 请求已经建立了连接&#xff0c;现在…...

Android音乐播放器的思路处理

** 1.android音乐播放播放列表中下一首上一首随机播放的思路 ** 实现 Android 音乐播放器的播放列表中的下一首、上一首和随机播放功能涉及到对音乐列表的管理以及对播放顺序的控制。以下是实现这些功能的思路&#xff1a; 下一首和上一首功能&#xff1a; 维护一个音乐列表…...

算法课程笔记——可撤销并查集

算法课程笔记——可撤销并查集 Gv...

【排序算法】快速排序

一、定义&#xff1a; 快速排序是Hoare于1962年提出的一种二叉树结构的交换排序方法&#xff08;也叫Hoare排序&#xff09;&#xff0c;是一种基于分治的排序方。其基本原理是将待排序的数组通过一趟排序分成两个独立的部分&#xff0c;其中一部分的所有数据比另一部分的所有数…...

OS复习笔记ch7-2

页式管理 学过计组的同学都了解一点页式管理&#xff0c;就是将内存划分成较小的、大小固定的、等大的块。现在OS引入了进程的概念&#xff0c;那么为了匹配内存的分块&#xff0c;同样把进程也划分成同样大小的块。 这里区分两个概念 The chunks of a process are called p…...

4.通用编程概念

目录 一、变量与常量1.1 变量1.2 常量 二、遮蔽三、数据类型3.1 标量类型1. 整型2. 浮点型3. 布尔类型4.字符类型 3.2 复合类型1. 元组2. 数组 四、函数五、语句和表达式六、函数的返回值 一、变量与常量 1.1 变量 在Rust中默认的变量是不可变的&#xff0c;如果修改其值会导致…...

iBeacon赋能AR导航:室内定位技术的原理与优势

室内定位导航对于大型商场、机场、医院等复杂室内环境至关重要&#xff0c;它帮助人们快速找到目的地&#xff0c;提高空间利用率。AR技术通过将虚拟信息叠加在现实世界&#xff0c;提供直观导航指引&#xff0c;正在成为室内导航的新趋势&#xff0c;增强用户互动体验&#xf…...

【sklearn】【逻辑回归1】

学习笔记来自&#xff1a; 所用的库和版本大家参考&#xff1a; Python 3.7.1Scikit-learn 0.20.1 Numpy 1.15.4, Pandas 0.23.4, Matplotlib 3.0.2, SciPy 1.1.0 1 概述 1.1 名为“回归”的分类器 在过去的四周中&#xff0c;我们接触了不少带“回归”二字的算法&#xf…...

java(kotlin)和 python 通过DoubleCloud的kafka进行线程间通信

进入 DoubleCloud https://www.double.cloud 创建一个kafka 1 选择语言 2 运行curl 的url命令启动一个topic 3 生成对应语言的token 4 复制3中的配置文件到本地&#xff0c;命名为client.properties 5 复制客户端代码 对python和java客户端代码进行了重写&#xff0c;java改成…...

vivado DIAGRAM、HW_AXI

图表 描述 块设计&#xff08;.bd&#xff09;是在IP中创建的互连IP核的复杂系统 Vivado设计套件的集成商。Vivado IP集成器可让您创建复杂的 通过实例化和互连Vivado IP目录中的IP进行系统设计。一块 设计是一种分层设计&#xff0c;可以写入磁盘上的文件&#xff08;.bd&…...

学习分享-为什么把后台的用户验证和认证逻辑放到网关

将后台的用户验证和认证逻辑放到网关&#xff08;API Gateway&#xff09;中是一种常见的设计模式&#xff0c;这种做法在微服务架构和现代应用中有许多优势和理由&#xff1a; 1. 集中管理认证和授权 统一的安全策略 在一个包含多个微服务的系统中&#xff0c;如果每个服务…...

27 ssh+scp+nfs+yum进阶

ssh远程管理 ssh是一种安全通道协议&#xff0c;用来实现字符界面的远程登录。远程复制&#xff0c;远程文本传输。 ssh对通信双方的数据进行了加密。 用户名和密码登录 密钥对认证方式&#xff08;可以实现免密登录&#xff09; ssh 22 网络层 传输层 数据传输的过程中是…...

LabVIEW液压伺服压力机控制系统与控制频率选择

液压伺服压力机的控制频率是一个重要的参数&#xff0c;它直接影响系统的响应速度、稳定性和控制精度。具体选择的控制频率取决于多种因素&#xff0c;包括系统的动态特性、控制目标、硬件性能以及应用场景。以下是一些常见的指导原则和考量因素&#xff1a; 常见的控制频率范…...

阿里云(域名解析) certbot 证书配置

1、安装 certbot ubuntu 系统&#xff1a; sudo apt install certbot 2、申请certbot 域名证书&#xff0c;如申请二级域名aa.example.com 的ssl证书&#xff0c;同时需要让 bb.aa.example.com 也可以使用此证书 1、命令&#xff1a;sudo certbot certonly -d “域名” -d “…...

Web LLM 攻击技术

概述 在ChatGPT问世以来&#xff0c;我也尝试挖掘过ChatGPT的漏洞&#xff0c;不过仅仅发现过一些小问题&#xff1a;无法显示xml的bug和错误信息泄露&#xff0c;虽然也挖到过一些开源LLM的漏洞&#xff0c;比如前段时间发现的Jan的漏洞&#xff0c;但是不得不说传统漏洞越来…...

Java等待异步线程池跑完再执行指定方法的三种方式(condition、CountDownLatch、CyclicBarrier)

Java等待异步线程池跑完再执行指定方法的三种方式(condition、CountDownLatch、CyclicBarrier) Async如何使用 使用Async标注在方法上&#xff0c;可以使该方法异步的调用执行。而所有异步方法的实际执行是交给TaskExecutor的。 1.启动类添加EnableAsync注解 2. 方法上添加A…...

秒杀优化+秒杀安全

1.Redis预减库存 1.OrderServiceImpl.java 问题分析 2.具体实现 SeckillController.java 1.实现InitializingBean接口的afterPropertiesSet方法&#xff0c;在bean初始化之后将库存信息加载到Redis /*** 系统初始化&#xff0c;将秒杀商品库存加载到redis中** throws Excepti…...

48、Flink 的 Data Source API 详解

a&#xff09;概述 本节将描述 FLIP-27 中引入的新 Source API 的主要接口。 b&#xff09;Source Source API 是一个工厂模式的接口&#xff0c;用于创建以下组件。 Split EnumeratorSource ReaderSplit SerializerEnumerator Checkpoint Serializer 此外&#xff0c;Sou…...

深入解析Java扩展机制:SPI与Spring.factories

目录 Java SPI概述 1.1 什么是SPI&#xff1f;1.2 SPI的工作原理1.3 SPI的优缺点 SPI的应用 2.1 Java标准库中的SPI应用2.2 自定义SPI示例 Spring.factories概述 3.1 什么是spring.factories&#xff1f;3.2 spring.factories的工作原理3.3 spring.factories的优缺点 spring.f…...

突破不可导策略的训练难题:零阶优化与强化学习的深度嵌合

强化学习&#xff08;Reinforcement Learning, RL&#xff09;是工业领域智能控制的重要方法。它的基本原理是将最优控制问题建模为马尔可夫决策过程&#xff0c;然后使用强化学习的Actor-Critic机制&#xff08;中文译作“知行互动”机制&#xff09;&#xff0c;逐步迭代求解…...

ESP32读取DHT11温湿度数据

芯片&#xff1a;ESP32 环境&#xff1a;Arduino 一、安装DHT11传感器库 红框的库&#xff0c;别安装错了 二、代码 注意&#xff0c;DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...

C++ 基础特性深度解析

目录 引言 一、命名空间&#xff08;namespace&#xff09; C 中的命名空间​ 与 C 语言的对比​ 二、缺省参数​ C 中的缺省参数​ 与 C 语言的对比​ 三、引用&#xff08;reference&#xff09;​ C 中的引用​ 与 C 语言的对比​ 四、inline&#xff08;内联函数…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

Java 二维码

Java 二维码 **技术&#xff1a;**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...

纯 Java 项目(非 SpringBoot)集成 Mybatis-Plus 和 Mybatis-Plus-Join

纯 Java 项目&#xff08;非 SpringBoot&#xff09;集成 Mybatis-Plus 和 Mybatis-Plus-Join 1、依赖1.1、依赖版本1.2、pom.xml 2、代码2.1、SqlSession 构造器2.2、MybatisPlus代码生成器2.3、获取 config.yml 配置2.3.1、config.yml2.3.2、项目配置类 2.4、ftl 模板2.4.1、…...

Caliper 负载(Workload)详细解析

Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...

Web后端基础(基础知识)

BS架构&#xff1a;Browser/Server&#xff0c;浏览器/服务器架构模式。客户端只需要浏览器&#xff0c;应用程序的逻辑和数据都存储在服务端。 优点&#xff1a;维护方便缺点&#xff1a;体验一般 CS架构&#xff1a;Client/Server&#xff0c;客户端/服务器架构模式。需要单独…...

前端中slice和splic的区别

1. slice slice 用于从数组中提取一部分元素&#xff0c;返回一个新的数组。 特点&#xff1a; 不修改原数组&#xff1a;slice 不会改变原数组&#xff0c;而是返回一个新的数组。提取数组的部分&#xff1a;slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...