Linux编译器gcc/g++

news2024/9/20 22:39:06

文章目录

  • Liinux编译器gcc/g++
    • 1.背景知识(程序的翻译)
    • 2.动态库、静态库


Liinux编译器gcc/g++

1.背景知识(程序的翻译)

以gcc编译
在这里插入图片描述
以g++编译,但是此时会发现没有g++这个指令,所有需要安装它,安装指令
yum install gcc gcc-c++
在这里插入图片描述
gcc和g++都会形成可执行文件a.out
gcc只能编译c语言代码,g++能编译c/c++
以c程序为例,来看看它从一个文本类的c程序编译成计算机可以认识的二进制程序它需要经过四个阶段

预处理
编译
汇编
连接

每个阶段要做什么?
预处理
预处理阶段会做

1.去注释
2.头文件展开
3.条件编译
4.宏的替换

编写一个c程序,其中有宏、头文件、注释
而gcc它预处理阶段所需的选项是-E
在这里插入图片描述
-E后面跟的是编写的文件,然后-o是生成目标文件,可以自己指定生成文件名
然后再打开文件将这两个文件一对比
在这里插入图片描述
预处理之后mycode这个文件里面的内容较于mycode.c文件多了太多内容了
在这里插入图片描述
从开始行一直往下翻,直到int main,它多了这些内容都是从头文件中拷贝过来的,而这个行为是头文件的展开
它多出了这么多内容是从头文件中拷贝过来的,那么这个头文件又是从哪来,其实在你安装编写c/c++或者其它语言的环境时,不仅仅是安装了软件,还将其所需的头文件库文件等内容也一并安装了,头文件头文件他也是文件对吧!来看看头文件存在系统哪里
一般开发所需的头文件它是在/usr/include/这个路径下
在这里插入图片描述
这个路径是Linux下gcc/g++它的头文件的搜索路径
在这里插入图片描述
如打开stdio.h这个头文件
在这里插入图片描述
它里面有很多内容
所有我们在安装如vs2022之类的开发环境之外,还安装了对应的开发包!同步也在下载了c/c++的头文件

而其中宏定义的M,经过预处理之后进行了值替换
注释也去掉了
在这里插入图片描述
条件编译

在这里插入图片描述
它是以宏的方式定义DEBUG,它是如果存在这个,那么就输出 printf(“hello\n”);

没有保留printf(“xiao\n”);,他这是选择!
在预处理之后编译器继续运行形成汇编!这个阶段叫做编译
编译
编译会将代码形成汇编
gcc -S mycode.c -o mycode.s
汇编,是 -S选项,后面跟源文件,-o 汇编成目标文件,一般以.s为后缀
在这里插入图片描述
vim打开mycode.s文件,会发现里面都是汇编代码
在这里插入图片描述
形成汇编代码之后再经过汇编阶段形成机器可以识别的二进制码
汇编
它汇编阶段的选项是-c
演示汇编阶段 gcc -c mycode.s -o mycode.o
在这里插入图片描述
当以vim打开这个文件,全是乱码,这是因为它是一个文本编辑器,要以专门看二进制文件的。
在这里插入图片描述
以od这个工具查看
在这里插入图片描述
汇编之后再经过连接形成可执行文件。
连接
直接gcc编译不用再跟选项,gcc mycode.i -o mytest它会形成可执行文件
在这里插入图片描述
-o后面紧跟着你要形成的文件名,自定义的!如果不加,那么它会形成a,out
-E:预处理!对程序进行翻译,将预处理工作做完就停下来,再执行就是编译了
-S:编译!将c语言代码翻译成汇编代码,编译工作做完之后就停下来,再执行就是汇编
-c:汇编!将汇编代码翻译成机器可识别的二进制码,它生成可重定向的二进制文件

2.动态库、静态库

连接:将二进制文件与库进行链接形成可执行程序
链接它的库是啥作用?这个库给我们提供方法,他其实就是c语言的标准库,那么它在哪存在?
存在:/usr/lib64之下,
在这里插入图片描述
此时只看见有动态库,等会安装静态库
静态库安装
安装C语言静态库
yum -y install glibc-static
安装c++静态库
yum -y install libstdc++-static
c语言的标准库本质上是一个文件,库分两种,Linux下:动态库(.so),静态库(.a)
windows:动态库(.dll),静态库(.lib)
而库一般有自己的命名规则的:libname.so.xxx

有了头文件有了库文件,它方法的实现也是再库中实现,它是把源文件经过一定的翻译,然后打包,只提供一个文件,这样也可以达到隐藏文件的目的
头文件提供方法的声明,库文件提供方法的实现,加上写的代码就成为一个软件了
gcc自动去找c语言库中找与.o文件链接形成可执行文件!那它们是如何链接的?
两种链接方案:动态链接;静态链接!
动态链接:就相当于高中,学校旁边哪哪哪有一个网吧,然后学生周天去上网,学生在执行着各种活动,然后忽然想去上网,它他在学校是上不了的,因为他没有电脑,所有他跑去网吧上网,打游戏!这个网吧就相当于动态库,每次想上网都要去网吧登机才行,这种链接方式就叫做动态链接!而网吧上网不可能只有你一个人吧,有很多人去,他是共享的,动态库是共享的,这所学校的所有学生要上网都去这个网吧去!
而当这个网吧倒闭之后,这所学校的学生就不能去上网了,真惨啊!
所有动态库不能缺失,一旦一个动态库缺失,可能很多程序都无法运行,不然会让很多程序都无法跑起来!
查看一个可执行程序依赖的动态库
ldd指令
在这里插入图片描述
如果删掉了这个动态库文件他就跑不起来了!不要删,不然可能不止他一个程序跑不起来,可能会很多都跑不起来,因为Linux很多指令都是用c语言实现的,如果你删了,可能很多指令也不能执行噢!
静态链接:将库中的方法拷贝到自己程序中,他每次要用的时候不用再去库中,自己就能实现,这样的方式就叫做静态链接!如果有一天他的方法所在库不在了他还是可以照样运行!它不再依赖于这个库了,它将所有方法都拷贝到这个程序中!
动态链接是将方法实现在哪里拷贝到程序中,每次要连接时都要去动态库中,静态连接是将方法实现拷贝到程序中,每次要时不必去静态库中连接!但是静态连接会使程序变大,因为它拷贝了更多的东西!

在Linux中默认采用的就是动态链接!使用动态库!
在这里插入图片描述
而如果当想要使用静态链接要在编译时要加-static选项。静态链接是需要手动添加选项的。此时也就要求系统提供静态库。

在这里插入图片描述
而静态链接可以发现它的体积远大于动态链接方式!
如果没有静态库是不能使用静态链接方式的,但是如果没有动态库,只有静态库,并且能够找到,这是可以的,就算没有使用static也可以因为gcc默认链接是动态如果没有会用静态链接!其实使用static是改变链接优先级了,所以啊,一个可执行程序,为其提供的库可能不止一个偶,可能动态静态都有!
来动静态库比一比
动态vs静态
动态库是共享库,可以有效的节省资源(磁盘、网络、内存空间)缺点:动态库不可缺失,一旦缺失导致很多程序无法运行
静态库不依赖库,程序可以独立运行。缺点:占用体积大,比较消耗资源!
debug和release
在vs下程序有两种开发方式debug和release方式,平时用的就是debug方式,当代码需要提测测试时要将其以release的方式发布!测试发布的版本和用户拿到的时一样的,默认发布为release,而以debug形成的可执行程序可以被追踪,为何?因为它添加了可调试信息
而由于它添加了调试信息,它形成的可执行程序的体积又要比一般程序的大
还说一个选项 -g选项,它会将软件以debug方式发布,
在这里插入图片描述
那么如何去看是否是debug方式发布呢,可以使用readelf -S来查看
在这里插入图片描述
它会以二进制方式查看,然后可以grep debug过滤
在这里插入图片描述
这些也就是添加的debug信息!
g++也是一样的,就不再演示了!
🆗就到这了!

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

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

相关文章

TransFusion:利用 Transformer 进行鲁棒性融合来进行 3D 目标检测

Query 初始化 Input-dependent 以往 Query 位置是随机生成或学习作为网络参数的,而与输入数据无关,因此需要额外的阶段(解码器层)来学习模型向真实对象中心移动的过程。 论文提出了一种基于center heatmap 的 input-dependent 初…

在 Python 中使用令牌进行 API 调用

文章目录 在 Python 中进行不带令牌的 API 调用在 Python 中使用令牌调用 API总结 当我们第一次遇到如何在 Python 中调用 API 的问题时,我们的第一个想法是,“什么是 API?”。 API是应用程序编程接口的首字母缩写; 它允许您访问…

【面试】Java并发编程

ThreadLocal ThreadLocal 为什么会导致内存泄漏 hreadLocalMap使用ThreadLocal的弱引用作为key,如果一个ThreadLocal不存在外部强引用时,Key(ThreadLocal)势必会被GC回收,这样就会导致ThreadLocalMap中key为null, 而value还存在着…

15-ajax、实现过程、封装

定义 🍿🍿🍿Async Javascript and XML 异步的JavaScript 和XML,是一种创建交互式网页应用的网页开发技术,可以在不重新加载整个网页的情况下,与服务器交换数据,并且更新部分网页 离不开 XMLH…

【C语言】万字教学,带你分步实现扫雷游戏(内含递归函数解析),剑指扫雷,一篇足矣

君兮_的个人主页 勤时当勉励 岁月不待人 C/C 游戏开发 带你轻松玩转扫雷游戏 前言一. 扫雷游戏的介绍以及内部需要实现的功能解析1.什么是扫雷游戏2.扫雷游戏所需的几个步骤 二.扫雷游戏的具体实现1.打印菜单菜单上的选择功能 2.初始化以及打印棋盘初始化函数InitBoard打印棋…

如何使用测试驱动开发(TDD)来实现100%的测试覆盖率?

本文以 DDM 为例,简单地介绍一下如何用测试驱动开发(TDD, Test-Driven Development)的方法来驱动出这个函数库。 本文以DDM为例,简单地介绍一下如何用测试驱动开发(TDD, Test-Driven Development)的方法来驱动出这个函数库。 DDM简介 DDM是…

vue-cli3的安装和项目创建

一 vue-cli3的安装 (注意:vue-cli3在安装之前,需要先删除旧版本,即vue-cli2) cnpm i -g vue/cli vue-cli3的卸载:cnpm uninstall -g vue/cli 然后用命令“vue -V”查看是否删除vue,如果没有删…

kafka原理架构深入

目录 1. 下载安装2. 命令行命令3. 概述3.1 定义3.2 基本架构 4. 架构深入4.1 生产者4.1.1 分区4.1.2 数据可靠性保证4.1.3 Exactly Once语义4.1.4 发送消息流程 4.2 broker4.2.1 日志结构4.2.2 存储策略4.2.3 Controller & ZooKeeper4.2.4 高效读写数据 4.3 消费者4.3.1 消…

模型-视图-控制器模式(MVC模式,10种常见体系架构模式之一)

、简介: 架构模式是一个通用的、可重用的解决方案,用于在给定上下文中的软件体系结构中经常出现的问题。架构模式与软件设计模式类似,但具有更广泛的范围。 模型-视图-控制器模式,也称为MVC模式。是软件工程中的一种软件架构模式&…

Word模板引擎poi-tl

文章目录 ◆ 方案对比◆ 版本◆ 特性◆ 模板◆ 数据◆ 输出◆ 数据模型◆ 标签1. 文本2. 图片3. 表格4. 列表5. 嵌套6. 区块对 ◆ SpingEL2. 单系列图标3. 多系列图标4. 组合图表 ◆ 配置1. 标签前后缀2. 标签类型3. 标签匹配值4. 标签值计算5. SpringEL6. 数据模型序列化7. 错…

设计模式之抽象工厂笔记

设计模式之抽象工厂模式笔记 说明Abstract Factory(抽象工厂)目录UML抽象工厂示例类图甜品抽象类甜品提拉米苏类甜品抹茶慕斯类 咖啡抽象类美式咖啡类拿铁咖啡类 甜品工厂接口美式风味的甜品工厂意大利风味的甜品工厂 测试类模式扩展 说明 记录下学习设计模式-抽象工厂模式的写…

吴恩达471机器学习入门课程3第1周——K-means

K-means 聚类 1 - 实现 K-means1.1 找到最近的质心练习11.2 计算质心均值练习2 2 - K-means在样本数据集上的应用3 - 随机初始化4 - K-means图像压缩4.1 数据集可视化处理数据 4.2图像像素上的 K-mean4.3 压缩图片 实现 K-means 算法,并将其用于图像压缩。 您将从一…

Autoware 跑 Demo(踩坑指南)

Autoware 跑 Demo(踩坑指南) 网上的博客和官方的教程,几乎都是一样的,但实际上跑不起来 Autoware 1.12学习整理–01–运行rosbag示例 Autoware入门学习(三)——Autoware软件功能使用介绍(1/3&a…

MySQL的IF(exp1, exp2, exp3)、IFNULL(exp1, exp2)函数的用法

本章主要是讲解一下mysql的常用方法if()和ifnull()的使用 1、if(exp1, exp2, exp3) 如果表达式exp1成立,则返回的结果是表达式exp2,否则返回的是表达式exp3 案例:现在有一个星印类型表xingyin_type 通过这个表来介绍一下这个函数的使用 sel…

轻松掌握Seata源码分析之AT模式整体大纲流程跟踪

如下为订单和库存的实例代码,在事务开启处即订单服务处使用GlobalTransactional即可。当添加了异常代码使订单无法加一,这时减库存服务也会回滚,根据的就是undolog。回滚完undolog记录会被释放删除。 AT模式整体大纲流程跟踪如下&#xff1…

第37步 深度学习图像识别:CNN建模(Tensorflow)

基于WIN10的64位系统演示 一、写在前面 (1)深度学习图像识别的原理 我们思考一下,当你看到一张椅子的图片,你的大脑会告诉你这是个椅子,但你有没有想过:为什么你知道这是椅子,你的大脑是怎么…

【Spring Cloud 系列】Eureka控制台参数说明

【Spring Cloud 系列】Eureka控制台参数说明 前面我们在《Eureka使用详解》一文中介绍了Eureka的使用。本文将介绍Eureka控制板面各参数: System Status 编号名称说明1Environment环境,默认为test,该参数在实际使用过程中,可以不…

单目标应用:Tiki-taka算法(TTA)求解太阳能光伏模型MATLAB

一、四种太阳能光伏模型 随着石油、煤炭、天然气等不可再生能源的快速枯竭,以及空气环境的严重污染,可持续、无污染的能源供应成为热点和关键问题。风能、太阳能、水能、潮汐能等可再生能源的开发利用,必然在未来的可持续发展中发挥至关重要…

德国企业数据统计分析【1】-基于pandas的GENESIS ONLINE数据简单统计与柱状图可视化

引言: 德国拥有很多年销售额不超过50亿美元的中小企业,但他们却是某些细分制造、工业领域的翘楚。并且隐身于大众视野之外。此处,隐形冠军指的就是细分领域行业处于绝对领先地位并且年销售额不超过50亿美元的中小企业。这一概念是由德国著名中小企业管理学家赫尔曼西蒙创立的…

电脑开机密码忘记了怎么办?使用优盘重装系统

大家可以在网上搜索,其他方法。尽量找回密码。我这是因为已经很久没有使用这个电脑,而且c盘也没有怎么重要资料的情况下。我才选择重装系统的。 请慎重。 前期准备: 1、准备一个4G以上的U盘 2、备份U盘重要文件,制作过程中会格式…