Linux中的gcc\g++使用

文章目录

    • gcc\g++的使用
      • 预处理
      • 编译
      • 汇编
      • 链接
      • 函数库
      • gcc选项

gcc\g++的使用

这里我们需要知道gcc和g++实际上是对应的c语言和c++编译器,而其他的Java(半解释型),PHP,Python等语言实际上是解释型语言,因此我们经常能听到c语言是偏向底层的语言

我们这里就以c语言为例,进行基础的讲解

我们知道计算机只能处理二进制代码,而在计算机发展的过程中,将二进制代码是用类似打孔纸带的东西承载的,再之后发展就是由汇编语言,将众多常用的二进制代码用助记符来表示,之后再由汇编语言发展而来的各类底层语言,也就是c语言

那我们把上面的过程反过来,就是电脑能够理解我们所写代码含义的过程了,也就称之为编译

在编译的过程中实际上分为四个阶段

那我们能否将编译的过程分段查看呢,其实在Linux中是可以做到的,只需要用一些指令即可

预处理

在这个阶段中,主要做一些准备工作,例如头文件展开,删除注释,条件编译,宏替换,这些工作都是在预处理阶段完成的,例如

我们首先使用vim创建一个c语言文件

vim test.c
#include<stdio.h>
int main()
{int i = 0;int sum = 0;for(; i <= 10; i++){sum += i;}printf("%d\n", sum);return 0;
}

我们使用gcc进行编译就可以直接产生一个可执行文件,这里我们可以用选项使他只进行预处理阶段的内容

gcc -E test.c -o test.i

这里的-E选项代表只进行预处理阶段的处理,-o表示生成文件的名称,我们一般把后缀名命名为i

可以使用vim可以看到里面的内容

屏幕截图 2023-12-28 192452.png

这里我们可以看到内容还是很多的,直接生成了八百多行的内容,因为他把stdio的内容全都转移到这个文件中了

但是我们还是可以看懂其中的内容的,说明他还是处于c语言阶段,并没有到汇编的内容

编译

实际上这一阶段就会将程序翻译成汇编语言,我们同样可以使用选项来查看内容

例如

gcc -S test.i -o test.s

屏幕截图 2023-12-28 192948.png

这里的代码对于没有学过汇编语言的人来说已经读不懂了,只能大概看懂里面的一些单词

汇编

这一过程就是将汇编转成可重定位的二进制文件,目前就只需要知道他是不可执行的即可

gcc -c test.s -o test.o

屏幕截图 2023-12-28 193400.png

链接

链接实际上就是字面意思,但是链接的是什么东西呢,实际上是对于函数库链接

我们在学习c语言的阶段了解过,需要包含stdio.h的头文件才可以进行一些格式化输入输出函数的使用,他其实就是函数库

函数库

在Linux中,有一个库文件叫做libc.so.6,在没有指定时,gcc会到默认路径下进行查找,再对其进行链接,这样就可以准确的调用到对应的函数了

对于这样的文件,libc.so.6,lib是前缀,后面的so之类的都是后缀,所以我们可以知道这个库其实是由c语言编写出来的

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

静态库是指编译链接时,将库文件的代码全部加入到可执行文件中,因此生成的文件也比较大,在运行时也不怎么需要库文件了,后缀名一般为a

动态库就是链接的主体了,这样做可以节省系统的开销,后缀名是so,在编译的过程中,gcc默认使用动态库,这样链接完成之后就会形成可执行文件了

gcc选项

选项说明
-E只预处理
-S只编译到汇编
-c编译到目标代码
-o生成可执行文件
-static采用静态链接
-g生成调试信息,GNU调试器可以利用该信息
-O0/ 无优化
-O1/ 缺省值
-O2/
-O3编译器优化的四个级别
-w不生成任何警告
-Wall生成所有警告信息
-shared尽可能使用动态库

感谢各位的支持,如果你发现文章中有任何不严谨或者需要补充的部分,欢迎在评论区指出

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DML语言(重点)———update

格式&#xff1a;update 要修改的对象 set 原来的值新值 -- 修改学员名字,带了简介 代码案例&#xff1a; -- 修改学员名字,带了简介 UPDATE student SET name清宸 WHERE id 1; -- 不指定条件情况下&#xff0c;会改动所有表&#xff01; 代码案例…

边缘计算网关:在智慧储能系统中做好储能通信管家

背景 目前储能系统主要由储能单元和监控与调度管理单元组成&#xff0c;储能单元包含储能电池组(BA)、电池管理系统(BMS)、储能变流器(PCS)等&#xff1b;监控与调度管理单元包括中央控制系统(MGCC)、能量管理系统(EMS)等。 2021年8月&#xff0c;国家发改委发布《电化学储能…

Vscode新手安装与使用

安装与版本选择 VS Code 有两个不同的发布渠道&#xff1a;一个是我们经常使用的稳定版&#xff08;Stable&#xff09;&#xff0c;每个月发布一个主版本&#xff1b;另外一个发布渠道叫做 Insiders&#xff0c;每周一到周五 UTC 时间早上6点从最新的代码发布一个版本&#x…

基于Java车间工时管理系统(源码+部署文档)

博主介绍&#xff1a; ✌至今服务客户已经1000、专注于Java技术领域、项目定制、技术答疑、开发工具、毕业项目实战 ✌ &#x1f345; 文末获取源码联系 &#x1f345; &#x1f447;&#x1f3fb; 精彩专栏 推荐订阅 &#x1f447;&#x1f3fb; 不然下次找不到 Java项目精品实…

【银行测试】金融银行-理财项目面试/分析总结(二)

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 银行理财相关的项…

Redis 分布式锁总结

在一个分布式系统中&#xff0c;由于涉及到多个实例同时对同一个资源加锁的问题&#xff0c;像传统的synchronized、ReentrantLock等单进程情况加锁的api就不再适用&#xff0c;需要使用分布式锁来保证多服务实例之间加锁的安全性。常见的分布式锁的实现方式有zookeeper和redis…

044、门控

之——GRU 目录 之——GRU 杂谈 正文 1.重置门和更新门 2.候选隐藏状态 3.新的隐状态 长短期记忆网络LSTM 1.候选记忆单元 2.记忆单元 3.隐状态 杂谈 关注一个序列&#xff0c;不是每个观察都同等重要&#xff0c;传统RNN会一直在Whh中隐含所有以前的信息&#xff0…

【LeetCode:LCR 143. 子结构判断 | 二叉树 + 递归】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

【12.28】转行小白历险记-刷算法04

01两两交换链表中的节点 整体思路 1.要修改后一个节点的指向一定要知道前一个节点的指向才可以改变后面一个节点的 2.分情况奇数和偶数节点&#xff0c;终止条件很重要 3.虚拟头节点&#xff0c;是对我们操作的指针是不是头节点进行判断 02删除链表的倒数第N个节点 思路 …

第十一章 Stream消息驱动

Stream消息驱动 gitee:springcloud_study: springcloud&#xff1a;服务集群、注册中心、配置中心&#xff08;热更新&#xff09;、服务网关&#xff08;校验、路由、负载均衡&#xff09;、分布式缓存、分布式搜索、消息队列&#xff08;异步通信&#xff09;、数据库集群、…

fastadmin想自定义表格的样式,可以使用模板渲染并在模板中调用自定义的方法

fastadmin 如何在模板中使用自定义的方法 比如页面上要对返回的时间&#xff0c;电话&#xff0c;身份证做处理 html页面 <script type"text/html" id"itemtpl"><span id"<%item.id%>" class"margins mobile"><…

企业品牌推广在国外媒体投放的意义和作用何在?

海外广告投放是企业在国际市场推广的重要战略&#xff0c;具有多种形式&#xff0c;包括社交媒体广告、短视频广告、电视广告等。这些广告形式在传播信息、推动销售、塑造品牌形象等方面发挥着独特的作用。 其中软文发稿是一种注重叙事和信息传递的广告形式&#xff0c;对于企…

【pynput】鼠标行为追踪并模拟

文章目录 前言基本思路安装依赖包实时鼠标捕获捕获鼠标位置捕获鼠标事件记录点击内容效果图 实时按键捕获控制按键操作捕获按键事件组合键记录区间设置 用户操作记录与回溯基本思路完整代码效果图 利用本文内容从事的任何犯法行为和开发与本人无关&#xff0c;请理性利用技术服…

【强化学习】基于蒙特卡洛MC与时序差分TD的简易21点游戏应用

1. 本文将强化学习方法&#xff08;MC、Sarsa、Q learning&#xff09;应用于“S21点的简单纸牌游戏”。 类似于Sutton和Barto的21点游戏示例&#xff0c;但请注意&#xff0c;纸牌游戏的规则是不同且非标准的。 2. 为方便描述&#xff0c;过程使用代码截图&#xff0c;文末附链…

【Spark精讲】一文讲透Spark RDD

MapReduce的缺陷 MR虽然在编程接口的种类和丰富程度上已经比较完善了&#xff0c;但这些系统普遍都缺乏操作分布式内存的接口抽象&#xff0c;导致很多应用在性能上非常低效 。 这些应用的共同特点是需要在多个并行操 作之间重用工作数据集 &#xff0c;典型的场景就是机器学习…

Vue(一):Vue 入门与 Vue 指令

Vue 01. Vue 快速上手 1.1 Vue 的基本概念 用于 构建用户界面 的 渐进性 框架 构建用户界面&#xff1a;基于数据去渲染用户看到的界面渐进式&#xff1a;不需要学习全部的语法就能完成一些功能&#xff0c;学习是循序渐进的框架&#xff1a;一套完整的项目解决方案&#x…

Django Cookie和Session使用(十一)

一、Cookie Cookie具体指一小段信息&#xff0c;它是服务器发送出来存储在浏览器上的一组键值对&#xff0c;下次访问服务器时浏览器会自动携带这些键值对&#xff0c;以便服务器提取有用信息。 Cookie的特性 1、服务器让浏览器进行设置的 2、保存在浏览器本地&#xff0c;…

linux 网络工具(二)

linux 网络工具 1. ip命令簇4.1 address4.2 link4.3 route4.4 rule 2. 其他常用命令2.1 ifup/ifdown2.2 配置主机名2.3 设置DNS服务器指向2.4 配置域名解析2.5 ss2.6 路由相关配置文件2.7 查看机器可用端口2.8 traceroute2.9 dhclient 1. ip命令簇 Linux的ip命令和ifconfig类似…

微信小程序picker组件扩展选择时间到秒插件

创建插件seldatetime // 插件JS部分 Component({// 一些选项options: {// 样式隔离&#xff1a;apply-shared 父影响子&#xff0c;shared父子相互影响&#xff0c; isolated相互隔离styleIsolation:"isolated",// 允许多个插槽multipleSlots: true},// 组件的对外属…

机器学习三要素与拟合问题

1.如何构建机器学习模型&#xff1f; 机器学习工作流程总结 1.获取数据 2.数据基本处理 3.特征工程 4.机器学习(模型训练) 5.模型评估 结果达到要求&#xff0c;上线服务&#xff0c;没有达到要求&#xff0c;重新上面步骤 我们使用机器学习监督学习分类预测模型的工作流…