【Linux】工具(3)——gcc/g++
咱们继续进阶,接下来进入到Linux工具中gcc和g++的学习
在本章博客正式开始介绍之前,我们先要弄清楚程序是怎么翻译的:
C语言程序环境
一、什么是gcc/g++
📌gcc是一个c编译器, g++是c++编译器。我们根据代码的后缀名来判断用哪个编译器,若代码后缀名是.c,就用gcc,若代码后缀名是.cpp就用g++编译器
由于gcc和g++编译原理和操作都相同,在本期博客中主要讲述gcc的使用,g++同理
二、gcc的使用
2.1 直接使用gcc
📌gcc可以直接使用,具体操作为:gcc 想要进行编译文件的文件名
直接使用gcc后文件将会被翻译为可执行文件
❗注意:直接使用gcc编译出的可执行文件名默认为a.out
📋举例:
我们首先写好一个.c文件:


用gcc来编译这个文件,发现会生成一个a.out可执行文件:

我们来运行一下这个可执行文件:

2.2 gcc -o
要想gcc编译完的可执行文件的文件名不想为a.out该怎么办呢?
我们可以在gcc后面加上-o选项
📌具体操作为:gcc 想要编译的文件的文件名 -o 生成可执行文件的文件名 或 gcc -o 生成可执行文件的文件名 想要编译的文件的文件名
📋举个栗子:


2.3 gcc -E
如果我们不想编译完文件,而只是想预处理一下源文件该如何操作呢?
在gcc后面加上-E选项就可以只对源文件进行预处理操作
📌具体操作为:gcc -E 想要预处理的文件的文件名
📋例如:

我们预处理一下这个test.c文件,并将预处理的结果放到test.i文件中(现在我们来对比一下两个文件):

可以看到test.i文件中很好的对代码进行了预处理
2.4 gcc -S
在gcc后面加上-E选项就可以只对文件进行编译操作(转换为二进制代码)
📌具体操作为:gcc -S 想要编译的文件的文件名
想要编译的文件可以是源文件也可以是预处理后的文件
📋例如:
我们现在将预处理后的test.i文件,编译一下放到test.s中

现在我们看一下编译后的代码:

2.5 gcc -c
在gcc后面加上-E选项就可以只对文件进行汇编操作(转换为二进制目标文件)
📌具体操作为:gcc -c 想要汇编的文件的文件名
想要编译的文件可以是源文件、预处理后的文件和编译后的文件
📋例如:
我们现在将编译后的test.s文件,汇编一下放到test.o中

来看一下汇编后文件:


三、谈谈链接
从上面我们很好的看到源文件所被预处理、编译和汇编的过程,但是链接的过程呢?
我们在直接使用gcc时所生成的可执行文件已经被链接过了,那它链接了什么内容呢?
在Linux环境下可以使用ldd指令来查看文件所链接的内容:
📌具体操作为:ldd 想要查看文件所链接内容的文件名
📋例如:

我们可以看到该文件链接了三个内容
接下来有一个问题:我们为什么能够在Linux环境下进行c/c++代码的编写和编译呢?
💡这是因为Linux系统默认已经携带了语言级别的头文件和语言相对应的库
Linux环境下的库分为两种,静态库和动态库(本质上都是文件)
静态库的命名格式为:
libXXXXXXX.a.版本号
动态库的命名格式为:
libXXXXXXX.so.版本号
以及我们在vs2022环境下可以编写和编译代码也是因为,vs环境帮助我们下载安装了头文件和库文件
💡那静态库和动态库有什么区别呢?
1.静态库专门让编译器,对用户的程序进行静态链接的;动态库专门让编译器,对用户的程序进行动态链接的
2.静态库和静态链接:链接的时候,如果是静态链接,找到静态库,拷贝静态库中的我所需要的代码到我自己的可执行程序中相关的位置
3.动态库和动态链接:链接的时候,如果是动态链接,找到动态库,拷贝动态库中的我所需要的代码的地址到我自己的可执行程序中相关的位置
4.静态链接成功:程序不依赖任何库,自己就可以独立运行
5.动态链接成功:程序还是依赖动态库,一旦动态库缺失,程序便无法运行!
6.静态库:因为自身拷贝的问题,比较浪费空间
7.动态库:因为可以做到被大家共享方法,所以真正的实现永远都是在库中,程序内部只有地址,比较节省空间
8.静态库vs动态库: Linux默认使用的是动态链接和动态库!
既然Linux环境下默认是动态链接,那么我们如果想以静态链接的方式编译文件该该怎么办呢?
💡我们可以在gcc指令后面加上-static选项
例如:
我们先对gcc默认编译的test.exe文件进行ldd和file查看一下链接和类型:

可以看到该文件是动态链接的
现在我们来使用-static选项来静态链接编译一个可执行文件:

可以看到该静态链接的文件比动态链接文件大了100倍!
❗注意:如果大家在使用-static选项有这样的报错:

这是因为自己LInux环境下没有安装静态库,使用下面两条指令安装一下即可:yum install -y glibc-static(C语言静态库)yum install -y glibc-static libstdc++-static(C++静态库)
Linux下gcc和g++工具到这里就给大家讲述完了,恭喜各位通关成功~
我们下一期见~
相关文章:
【Linux】工具(3)——gcc/g++
咱们继续进阶,接下来进入到Linux工具中gcc和g的学习在本章博客正式开始介绍之前,我们先要弄清楚程序是怎么翻译的:C语言程序环境一、什么是gcc/g📌gcc是一个c编译器, g是c编译器。我们根据代码的后缀名来判断用哪个编译…...
Android文件选择器
使用方法:在里层的build.grade的dependency里面加入: implementation com.leon:lfilepickerlibrary:1.8.0 引用https://github.com/leonHua/LFilePicker/blob/master/README_CH.md#lfilepicker LFilePicker 说明:如果发现应用名称被修改,可以参考issues#26 查看解决方案,或…...
《MySql学习》 Select 查询语句慢的非性能原因
一.查询被阻塞 A会话执行 查询操作,长时间没有返回信息,此时我们就可以去排查一下是否是被阻塞了 select * from words 被阻塞的原因有很多,首先列举第一种情况 1.等MDL锁 当我们执行DDL语句时,会自动给表加上MDL写锁。当执行DML和DQL时&…...
Vue组件间通信方式超详细(父传子、父传后代、子传父、后代传父、兄弟组件传值)
一、父传子、父传后代 方式一:子通过props来接收 父组件:父组件引入子组件时,通过<child :parentValue "parentValue"></child>子组件传值。 备注:这种方式父传值很方便,但是传递给后代组件不…...
【ES】Elasticsearch-深入理解索引原理
文章目录Elasticsearch-深入理解索引原理读操作更新操作SHARD不变性动态更新索引删除和更新实时索引更新持久化Segment合并近实时搜索,段数据刷新,数据可见性更新和事务日志更新索引并且将改动提交修改Searcher对象默认的更新时间Elasticsearch-深入理解…...
pdf压缩文件大小的方法是什么?word文件怎么批量转换成pdf格式?
大家在存储文件时,通常会遇到一些较大的文件,这时需要对其进行压缩处理。下面介绍一下如何压缩PDF文件大小以及批量转换Word文件为PDF格式。pdf压缩文件大小的方法是什么?1.打开小圆象PDF转换器,选择“PDF压缩”功能。2.在“PDF压缩”界面中…...
论文阅读——FECANet:应用特征增强的上下文感知小样本语义分割网络
代码:NUST-Machine-Intelligence-Laboratory/FECANET (github.com) 文章地址:地址 文章名称:FECANet: Boosting Few-Shot Semantic Segmentation with Feature-Enhanced Context-Aware Network 摘要 Few-shot semantic segmentation 是学习…...
数组模拟常见数据结构
我们来学习一下用数组模拟常见的数据结构:单链表,双链表,栈,队列。用数组模拟这些常见的数据结构,需要我们对这些数据结构有一定的了解哈。单链表请参考:http://t.csdn.cn/SUv8F 用数组模拟实现比STL要快&a…...
ADC0832的AD模数转换原理及编程
✅作者简介:嵌入式领域优质创作者,博客专家 ✨个人主页:咸鱼弟 🔥系列专栏:单片机设计专栏 📃推荐一款求职面试、刷题神器👉注册免费刷题 目录 一、描述 二、模数转换原理: 三、…...
【工具插件类教学】UnityPackageManager私人定制资源工具包
目录 一.UnityPackageManager的介绍 二.package包命名 三.包的布局 四.生成清单文件 五.制作package内功能 六.为您的软件包撰写文档 1.信息的结构 2.文档格式 七.提交上传云端仓库 1.生成程序集文件 2.上传至云端仓库 八.下载使用package包 1.获取包的云端路径 …...
【软件测试】2023年了还不会接口测试?老鸟总结接口测试面试谁还敢说我不会......
目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 测试面试࿰…...
类Vuex轻量级状态管理实现
引用自 摸鱼wiki 1. vuex vuex是一个前端广泛流行的状态管理库,主要由以下几大模块组成: state:状态存储getter:属性访问器mutation:可以理解为一个同步的原子性事务,修改state状态action:触发…...
Java 基本数据类型
Java基本数据类型是Java编程语言中最基本的数据类型,包括整型、浮点型、字符型、布尔型和空类型。本文将详细介绍Java基本数据类型的作用和在实际工作中的用途。 整型(int、long、short、byte) 整型是Java中最常见的基本数据类型࿰…...
全网资料最全Java数据结构与算法-----算法分析
算法分析 研究算法的最终目的就是如何花更少的时间,如何占用更少的内存去完成相同的需求,并且也通过案例演示了不同算法之间时间耗费和空间耗费上的差异,但我们并不能将时间占用和空间占用量化,因此,接下来我们要学习…...
【封装xib补充 Objective-C语言】
一、那么首先,咱们就从这个结果来分析 1.就不给大家一步一步分析了,直接分析我们这里怎么想的, 首先,我们看到这样的一个界面,我们想,这些应用数据是不是来源于一个plist文件吧, 所以说,我们首先要,第一步,要懒加载,把这个plist文件中的数据,加载起来, 那么,因…...
linux + jenkins + svn + maven + node 搭建及部署springboot多模块前后端服务
linux搭建jenkins 基础准备 linux配置jdk、maven,配置系统配置文件 vi /etc/profile配置jdk、maven export JAVA_HOME/usr/java/jdk1.8.0_261-amd64 export CLASSPATH.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jarexport MAVEN_H…...
VBA之正则表达式(41)-- 快速标记两个星号之后的字符
实例需求:工作表中的数据保存在A列~G列,现需要识别D列中包含超过两个星号的内容,并将第3个星号及其之后的字符设置为红色字体,如图所示。 示例代码如下。 Sub Demo1()Dim objRegExp As ObjectDim objMatch As ObjectDim strMatch…...
VMware16安装MacOS【详细教程】
安装VMware workstation 双击安装包,然后一直下一步就行了。 进行VMware安装,一直 下一步 在输入产品密钥这一步,如果有查找到可用密钥就填进去,没有就跳过,进入软件后也能输入密钥的。 输入密钥。 最后一步ÿ…...
Netty学习(一):Netty概述
一、原生NIO存在的问题 NIO 的类库和API繁杂,使用麻烦:需要熟练掌握Selector、ServerSocketChannel、SocketChannel、ByteBuffer等。需要具备其他的额外技能:要熟悉Java 多线程编程,因为NIO编程涉及到Reactor 模式,你必须对多线程和网络编程…...
【论文精读】Benchmarking Deep Learning Interpretability in Time Series Predictions
【论文精读】Benchmarking Deep Learning Interpretability in Time Series Predictions Abstract Saliency methods are used extensively to highlight the importance of input features in model predictions. These methods are mostly used in vision and language task…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...
【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...
如何为服务器生成TLS证书
TLS(Transport Layer Security)证书是确保网络通信安全的重要手段,它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书,可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...
让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...
【数据分析】R版IntelliGenes用于生物标志物发现的可解释机器学习
禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍流程步骤1. 输入数据2. 特征选择3. 模型训练4. I-Genes 评分计算5. 输出结果 IntelliGenesR 安装包1. 特征选择2. 模型训练和评估3. I-Genes 评分计…...
安卓基础(aar)
重新设置java21的环境,临时设置 $env:JAVA_HOME "D:\Android Studio\jbr" 查看当前环境变量 JAVA_HOME 的值 echo $env:JAVA_HOME 构建ARR文件 ./gradlew :private-lib:assembleRelease 目录是这样的: MyApp/ ├── app/ …...
【Linux系统】Linux环境变量:系统配置的隐形指挥官
。# Linux系列 文章目录 前言一、环境变量的概念二、常见的环境变量三、环境变量特点及其相关指令3.1 环境变量的全局性3.2、环境变量的生命周期 四、环境变量的组织方式五、C语言对环境变量的操作5.1 设置环境变量:setenv5.2 删除环境变量:unsetenv5.3 遍历所有环境…...
