【Linux】:Linux开发工具之Linux编译器——gcc/g++的使用

news2024/9/25 17:20:24

在这里插入图片描述

💻1.背景知识

🍲1. 预处理(进行宏替换)
预处理阶段我们要分为1.头文件展开2.宏替换3.条件编译4.去掉注释
这一步会帮助我们生成.i文件
🍲2. 编译(生成汇编)
编译阶段我们要分为1.检查语法2.生成汇编代码
最后生成.s文件
🍲3. 汇编(生成机器可识别代码)
汇编阶段我们要将代码转化成二进制的机器码(CPU可识别)
生成.o文件
🍲4. 链接(生成可执行文件或库文件)
合并文件 链接一些没有确定的函数的地址等’
生成a.out文件

💻2.gcc如何完成

🚩格式 gcc [选项] 要编译的文件 [选项] [目标文件]
🚩预处理(进行宏替换)
预处理功能主要包括宏定义,文件包含,条件编译,去注释等
预处理指令是以#号开头的代码行
实例: gcc –E hello.c –o hello.i
选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程
选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序
📍编译(生成汇编)
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言
用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码
实例: gcc –S hello.i –o hello.s
🔫汇编(生成机器可识别代码)
汇编阶段是把编译阶段生成的“.s”文件转成目标文件
读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
实例: gcc –c hello.s –o hello.o
📞链接(生成可执行文件或库文件)
在成功编译之后,就进入了链接阶段
实例: gcc hello.o –o hello
这里问大家一个小问题 请问现有的语言还是先有的编译器呢?
答案是现有的语言
在这里插入图片描述
我们最早的是二进制 然后是汇编语言这种低级语言的诞生 然后诞生了C语言这种高级语言 最后在C语言的改造上诞生了C++面向对象的高级语言
首先我们虽然没有可识别汇编语言的汇编编译器 但是我现在有二进制 我就用二进制写了一个汇编编译器出来 编译器是一个软件 那么我们现在用汇编写一个编译器怎么形成一个软件呢?所以我们用二进制编译器编译就形成了一个第一个用汇编语言写的编译器就诞生了
由于编译器自身需要优化换代 我们就自己淘汰自己生成更好的自己 我们把这个过程称之为语言和编译器的自举过程
在这里插入图片描述
🎼那么C语言也是同一个道理 具体见上图
在这里插入图片描述
当我把1.0和2.0都屏蔽掉的时候就直接执行else语句
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
上述问题的就是我们程序在预处理阶段 编译汇编以及链接生成可执行程序期间的所有指令 现阶段先按照指令按部就班的写 等后期学习得更加深入我们在详细阐述
思考下面问题
在这里插入图片描述
感兴趣的同学可以把答案写在评论区 我看到了话会给出解释的哦

💻3.动态库和静态库

静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”
动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。 gcc hello.o –o hello
gcc默认生成的二进制程序,是动态链接的,这点可以通过 file 命令验证
这个动静态库有点难以理解 我们这里以孩子在学校上课周末写完作业去网吧打游戏的例子 看下图
在这里插入图片描述
解释:此时我们的网吧就是动态库 我们每个个体是一个个的内存 可执行程序 现在是周末 我按照计划写完了周末作业 现在要去网吧打游戏了 去到网吧就叫到老板说 老板给我开个十号机 然后打了一个小时之后就就回到学校了 不光是我一个人在网吧打游戏 我的室友他们都在网吧打游戏 都是打了一个小时就回寝室继续写作业了 但是有一天 网吧被人举报了 当地的派出所就立马过来警告网吧老板让老板停店整顿 然后有一次年级考试 我成功的考到了第一 回家让爸爸给我买一台电脑 我说我喜欢网吧的那台十号机 老爸就给我整了一台放在学校寝室里面了 然后另一个同学考了年纪第二 他也要让他的爸爸给他买一台电脑 她说他喜欢网吧里的六号机 他爸爸也给他买了一台六号机放在学校寝室 接着剩下的同学都如此 过了一段时间以后 网吧恢复营业了 发现最近的生意没有平时好了 老板这才想起电脑都已经卖出去了 此时网吧就成为了静态库 希望大家能够理解
静态库:允许拷贝
动态库:允许关联

💻4.gcc选项

-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
-S 编译到汇编语言不进行汇编和链接
-c 编译到目标代码
-o 文件输出到 文件
-static 此选项对生成的文件采用静态链接
-g 生成调试信息。GNU 调试器可利用该信息。
-shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
-O0
-O1
-O2
-O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
-w 不生成任何警告信息。
-Wall 生成所有警告信息

💻5.gcc选项记忆

ESc,iso例子

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

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

相关文章

物联网二维码核销盒对接文档

核销盒是干嘛的? 1.在某些场景下快速核销订单或打卡签到等,通过核销盒能快速将订单信息发送到后端进行处理。 一,首先你需要有一台核销设备,也就是核销盒。 二,通过接口激活或更新核销盒 ​​​​​​​ 简要描述 激…

如何通过API接口对接淘宝平台商品订单/买家订单/卖家订单接口数据【附代码实例】

通过API获取订单号: 如果需要通过API获取订单号,首先需要在淘宝联盟开通API权限,并获取到自己的appKey和appSecret。 具体步骤如下: (1)构建API请求,包括API接口、请求参数、签名等信息&…

UTC时间戳与北京时间转换

文章目录 前言一、几个时间相关的概念二、场景三、验证方法四、源码五、运行结果六、资源自取 前言 在应用中用到了 UTC 时间戳与北京时间进行转换的需求,这里做一个记录,方便后面有需求时直接拿来用。 一、几个时间相关的概念 GMT 时间:Gr…

【分布式·大数据】大模型赛道如何实现华丽的弯道超车 —— AI/ML训练赋能解决方案

文章目录 大模型赛道如何实现华丽的弯道超车 —— AI/ML训练赋能解决方案01 具备对海量小文件的频繁数据访问的 I/O 效率02 提高 GPU 利用率,降低成本并提高投资回报率03 支持各种存储系统的原生接口04 支持单云、混合云和多云部署01 通过数据抽象化统一数据孤岛02 …

数据库扩展语句,约束方式

扩展语句 create table if not exists ky32 ():如果表存在就不创建了 zerofill 自动补齐(在命令行可以查看) primary key 设置成主键 auto_increment 表示这一列可以自增,默认从1开始,每条记录…

springboot和flask整合nacos,使用openfeign实现服务调用,使用gateway实现网关的搭建(附带jwt续约的实现)

环境准备: 插件版本jdk21springboot 3.0.11 springcloud 2022.0.4 springcloudalibaba 2022.0.0.0 nacos2.2.3(稳定版)python3.8 nacos部署(docker) 先创建目录,分别创建config,logs&#xf…

轻松理解 Transformers(2):Attention部分

编者按:随着人工智能技术的不断发展,Transformers 模型架构已成为自然语言处理领域的重要基石。然而,许多人对其内部工作机制仍然感到困惑。本文通过浅显易懂的语言和生活中的例子,帮助读者逐步理解 Transformers 中最核心的 Atte…

加速度中标云尖信息「电子元器件商城」开发项目——加速度jsudo

深圳市加速度软件开发有限公司在电子元器件和工业品行业有着多年得商城开发经验,服务过半导体、元器件、工业品行业的多家上市公司或实力工厂。选择加速度合作的60%的客户,或多或少都有踩坑的经历,这一次他们在选择商城开发商的时候格外谨慎&…

绝味食品营收失速,“卤味鸭脖”还卖得动吗?

随着三季报的密集披露期到来,多家消费领域休闲食品行业上市公司三季报报喜,在消费端呈现欣欣向荣的景象。 甘源食品:2023年前三季度营收13.14亿元,同比增长35.56%,净利润2.14亿元,同比增长139%&#xff0c…

delphi 11.3 FastReport 多设备跨平台 打印之解决方法

以下能WINDOWS10 DELPHI 11.3 FastReport6.0上顺利通过 FastReport6.2对Multi-Device Application应用的支持不够友好,如下图;在palette FastReport6.0才出现几个制件。 非Multi-Device Application应用时是一大堆; 非Multi-Device Appl…

(CESM)地球系统模式

目前通用地球系统模式(Community Earth System Model,CESM)在研究地球的过去、现在和未来的气候状况中具有越来越普遍的应用。CESM由美国NCAR于2010年07月推出以来,一直受到气候学界的密切关注。近年升级的CESM2.0在大气、陆地、海…

腾讯云轻量应用服务器的“镜像”操作系统选择方法

腾讯云轻量应用服务器镜像怎么选择?如果是用来搭建网站可以选择宝塔Linux面板腾讯云专享版,镜像系统根据实际使用来选择,腾讯云百科txybk.com来详细说下腾讯云轻量应用服务器镜像的选择方法: 腾讯云轻量应用服务器镜像选择 轻量…

Spring源码-refresh(1)

1、Refresh方法简介 refresh 是Spring的核心流程,主要包含13个方法。这13个方法中主要又包含3个方法。 如图: 其中标记星号的代表主要的方法。从方法中后面的分支数据也可以看出,主要的方法中存在大量的逻辑处理,后面我们会慢慢分…

Android出现app右上角打了小叉叉

解决方法 找到项目文件夹--------找到.idea文件然后删除--------再次从新打开

黄金期货与黄金现货的区别

黄金期货与黄金现货是有区别的,比如在交易机制方面,黄金期货有具体的交割日,合约到期就必须交割,否则会被强行平仓或以实物进行交割,而在保证金不足时也会被强行平仓;而现货黄金就没有交割限制,…

于璠访谈录 | AI 框架应该和而不同?

点击以下链接收听本期 “大咖访谈” 播客,与大咖面对面: 大咖访谈链接:于璠 | AI 框架应该和而不同? 刘天栋:访谈主持,开源雨林社区顾问、开源社联合创始人、ASF member 于璠:访谈嘉宾&#xf…

Redis——哨兵模式与Zookeeper选举的异同点

摘要 当我们使用主从复制出现的问题:手动故障转移:写能力和存储能力受限:主从复制 -master 宕机故障处理。 主从切换技术的方法是:当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干…

1.qt引入华为鸿蒙字体库

目录 背景下载鸿蒙字体库资源引入使用字体库 背景 因为一些字体是要收费的, 如果使用了,并且商业用途,那么属于侵权行为,那么在此时我们就想要用一些可商用免费开源的字体库,目前华为鸿蒙字体提供了我们一个解决方案&…

MySQL安装后,同局域网其他电脑无法连接问题

MySQL安装后,同局域网其他电脑无法连接问题 1、问题: 在同一个局域网下,笔者电脑安装了MySQL数据库后,出现了其他伙伴想连接笔者电脑的MySQL,而连不上的问题。 2、解决方案 在防火墙中添加开放端口: 第…

MySQL操作命令整理

MySQL操作命令整理 SQL分类 SQL语句按照其功能范围不同可分为3个类别: 数据定义语言(DDL ,Data Defintion Language)语句:数据定义语句,用于定义不同的数据段、数据库、表、列、索引等。常用的语句关键字包括create、drop、alter等。数据操作语言(DML , Data Manipulatio…