Linux修炼之路之gcc/g++,动静态链接及动静态库

news2024/11/14 21:33:01

目录

一:Linux编译器-gcc/g++ 

 预处理-编译-汇编-链接

1.预处理

2.编译 (生成汇编)

3.汇编(生成机器可识别代码)

4.链接(生成可执行文件或库文件)

 三:动静态链接和动静态库

动静态库

动静态链接

1.动态链接 

2.静态链接

3.注意点

4.各自优缺点

5.ldd和file指令

四:debug和release,readelf指令

接下来的日子会顺顺利利,万事胜意,生活明朗-----------林辞忧

一:Linux编译器-gcc/g++ 

1.对于gcc只能编译c语言代码,g++既能编译c语言代码也能编译c++代码,但g++主要编译c++

2.常用形式 gcc/g++ 文件名,此时就会形成a.out的可执行文件,再./a.out

3.也可以根据以下方式来书写

gcc 源文件名 -o 目标文件名(推荐写法)(一步到位,下面的是分步处理)

 gcc -o 目标文件名  源文件名 

 

4.对于为啥我们直接能够在windows/Linux中进行 c/c++等的开发呢?

最重要的是我们的系统中一定要提前或者后续安装上c/c++开发相关的头文件,库文件

对于c/c++中起始的几行都是c/c++的头文件,这些头文件在预处理时会全部展开,而对于具体的调用的函数如printf,就得调用c/c++标准库的库函数来完成对应的操作

所以只要系统安装了相关的头文件和库文件就可以完成c/c++的开发,具体的来说就是c/c++开发环境不仅仅指的是vs,gcc,g++这些,更重要的是语言本身的头文件和库文件

因此对于编译型的语言,安装开发包,必定是下载安装包对应的头文件和库文件

Linux下的头文件路径 --gcc/g++编译时的默认搜索路径

 预处理-编译-汇编-链接

1.预处理

预处理阶段完成的是宏调换,去注释,头文件展开,条件编译等操作,仍是c代码

gcc表示格式:gcc -E 源文件名 -o 以.i结尾的目标文件

-E:告诉gcc,从现在开始进行程序的翻译,将预处理工作做完就停下来,不用往后继续执行

2.编译 (生成汇编)

在这个阶段gcc要检查代码的规范性,是否有语法错误等,在检查无误后,将c代码翻译为汇编语言

gcc表示格式:gcc -S 源文件名 -o 以.s结尾的目标文件

 -S:告诉gcc,从现在开始进行程序的翻译,将编译工作做完就停下来,不用往后继续执行

3.汇编(生成机器可识别代码)

gcc表示格式:gcc -c 源文件名 -o 以.o结尾的目标文件

 -c:告诉gcc,从现在开始进行程序的翻译,将汇编工作做完就停下来,不用往后继续执行

.o结尾的这个文件叫做可重定位目标二进制文件,简称目标文件,就是windows中的.obj文件

不需要独立执行,虽然是二进制的但仍需要经过连接才能执行

4.链接(生成可执行文件或库文件)

将可重定位目标二进制文件和库进行链接形成可执行程序

作用:在我们的c程序中,对于printf 这样的库函数,在预编译时的展开的头文件里也只有函数的声明,没有实现,那么是在哪里实现的呢?----------答案是系统把这些函数实现都被做到名为libc.so.6的库文件中去了,在没有特别指定时,gcc会到系统的默认搜索路径/usr/lib下查找,也就是链接到libc.so.6库函数中去,这样便实现了printf函数

gcc表示格式:gcc -c 源文件 -o 目标文件

 三:动静态链接和动静态库

1.库的理解

库其实是给我们提供方法的实现,如上面的对于printf函数的实现就是在库中实现的,而这个库也就是c标准库,本质也是文件,也有对应的路径

动静态库

1.在Linux和windows都将库分为静态库和动态库,两者只有命名方式上的不同

       Linux中:.so(动态库)    .a(静态库)     windows :     .dll(动态库)    .lib(静态库)

       静态库是指编译链接时,把库文件的代码全部加入到可执行文件中

       动态库:在程序执行时由运行时链接文件加载库,只加载所需要的,节省空间大小

2.命名规则:libname.so.xxx,name为c就是c库,c++就是c++库

3.在Linux中只会安装动态库,而静态库需要自己安装

      sudo yum install -y glibc-static(c静态库)    sudo yum install -y libstdc++-static(c++静态库)

 4.库的作用

根据上面得知,方法的实现就在库当中,库就是将源文件(.c)经过一定的翻译,然后打包,封装然后只提供一个所需的文件,而将其他源文件隐藏

具体的软件的实现=头文件中的方法声明+库文件提供的方法实现+具体代码

5.由于gcc编译时默认使用的是动态库,完成的是动态链接,如要实现静态链接就要添加-static

动静态链接

这里先举个鲜明的例子来帮助铺垫和理解

1.动态链接 

动态链接就是当可执行程序自己完成不了时,就需要跳转到库中,执行库中的方法,执行完后再进行返回

特点:拷贝的是在哪里实现,不拷贝具体的实现方法;动态库只需要一个;可执行程序依旧依赖库;一旦缺失动态库,会影响很多的可执行程序无法正常运行

2.静态链接

编译器使用静态库进行静态链接时,会将静态库的所有方法实现拷贝到可执行程序中,使该程序不再依赖静态库

3.注意点

  1.如果我们没有静态库,但就要-static  ,是不行的

  2.如果没有动态库,但有静态库,而且gcc能找到,这个是可以的; 因为gcc默认优先动态链接,       而-static的本质就是改变优先级,使所有链接要求变为静态链接,并且只能适配一次

3.所有的链接都是静态链接和动态链接混合使用的

4.各自优缺点

动态库:优:因为是共享库,可以有效的节省资源(磁盘空间,内存空间,网络空间等)

              缺:一旦缺失,导致各个程序都无法运行

静态库:优:不依赖库,程序可以独立运行

              缺:体积大,比较消耗资源

5.ldd和file指令

ldd 是查询文件依赖的动态库  ldd 文件名

file 查询可执行程序是动态链接还是静态链接 file 文件名

四:debug和release,readelf指令

1.gcc默认编译出来的是release版本

2.对于debug版本因为在形成可执行程序时,添加了debug信息,是可以被追踪调试

3.debug版本 只需添加-g 选项即变为debug版本

4. readlf指令

readelf -S 文件名 | grep -i debug    查看添加的debug信息

readelf -S 文件名    读取可执行程序的对应二进制构成 

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

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

相关文章

20240514基于深度学习的弹性超材料色散关系预测与结构逆设计

论文:Dispersion relation prediction and structure inverse design of elastic metamaterials via deep learning DOI:https://doi.org/10.1016/j.mtphys.2022.100616 1、摘要 精心设计的超材料结构给予前所未有的性能,保证了各种各样的具…

安防视频汇聚/智能分析云平台EasyCVR调用localfile接口会返回日志的问题该如何解决?

视频汇聚/安防视频融合云平台EasyCVR视频监控系统支持多协议接入、兼容多类型设备,平台能在复杂的网络环境中(专网、局域网、广域网、VPN、公网等)将前端海量的设备进行统一集中接入与视频汇聚管理。视频监控/集中存储系统EasyCVR平台可支持国…

QCustomPlot - 柱状堆积图

参考链接 显示柱状图的值 QCustomPlot下载 下载地址:https://www.qcustomplot.com/index.php/download选择版本2.1.0 QCustomPlot.tar.gzQCustomPlot 的使用 解压下载的文件 把qcustomplot.h和qcustomplot.cpp放到自己的项目工程(复制文件并qt 的目录…

linux系统介绍和安装教程(含安装链接放在最下面了)

一、linux系统简介 在Linux和C语言的发展历程中,有几位关键人物为它们的诞生和推广做出了重要贡献。 首先,肯汤姆森(Ken Thompson)是一位在AT&T公司工作的员工,他不仅发明了B语言,还创造了Unix系统。…

Window下安装kettle并配置MySQL驱动,实现表输入输出

一. 安装并配置Java环境 1、JDK下载地址:Archived OpenJDK GA Releases 2、根据自己的需求选择版本进行下载并解压,我这里安装的是JDK21。 然后解压出来放到指定文件夹,我的地址是:C:\Program Files\Java 3、配置环境变量 Win菜…

怎么看电脑是固态还是机械硬盘?数据丢失怎么办

在数字化时代,电脑硬盘作为数据存储的核心部件,其类型直接关系到数据读写速度和存储效率。固态硬盘(SSD)与机械硬盘(HDD)作为目前市场上主流的两种硬盘类型,各有其优缺点。然而,对于…

Vue3 - 项目配置多环境配置文件

最常见的多环境配置,就是开发环境配置,和生产环境配置(也就是上线的配置),很多情况下我们开发环境下的域名,和一些配置项,和我们生产模式下的不同,这个时候就需要我们进行多环境配置,不然每次发版都要改一波数据多麻烦。 另一种情况就是你两个项目是用的一套代码,但是最…

青岛东软载波子公司东软载波微电子授权世强硬创代理,出货量累计超20亿颗

凭借业内独特的互联网推新模式,世强先进(深圳)科技股份有限公司(下称“世强先进”) 获得本土工业MCU企业——上海东软载波微电子有限公司(下称“东软载波微电子”,英文:essemi&#…

【Kubernetes】污点、容忍度、亲和性、调度和重启策略

标签、污点、容忍度、亲和性 一、标签1、定义2、给资源打标签【1】给Pod打标签【2】给Service打标签【3】给Node打标签 3、查看资源标签 二、节点选择器1、nodeName2、nodeSelector 三、污点、容忍度、亲和性1、node节点亲和性【1】硬亲和性【2】软亲和性 2、pod节点亲和性【1】…

直播用什么领夹麦比较好?多款音质出色的无线领夹麦克风推荐

近年来,随着网络直播、短视频、网课等新兴行业的蓬勃发展,大家对领夹麦克风的需求量也在不断增加,因为一款优质的领夹麦克风不仅方便携带,而且能够带来更清晰、更真实的录音效果,让我们在各种场景下都能获得满意的录音…

第二证券股市策略:股票st连续跌停卖不出怎么办啊?

对于接连跌停的st股票买不出,投资者只能早早地挂出跌停托付单等着成交,在当天没有成交,其托付单会被撤销,投资者能够挑选进行隔夜托付卖出时,最好在证券公司清算之后,再进行托付卖出,否则&#…

ORACLE ODAX9-2的一个误告警Affects: /SYS/MB的分析处理

在运维的多套ORACLE ODAX9-2版本,都遇到了一个计算节点的告警:Description: The service Processor poweron selftest has deteced a problem. Probabity;:100, UulD:cd1ebbdf-f099-61de-ca44-ef646defe034, Resource:/SYS/MB,;此告警从描述上…

哪个牌子的超声波清洗机好?四大质量出众超声波清洗机汇众

由于科技的进步,超声波清洗机已经成为了家庭和专业场所不可或缺的高效清洁工具。它利用超声波波动产生的微小气泡来清洁物品表面及细缝中的污渍,实现深层次的清洁效果。特别是对于眼镜这样的精密物品,定期进行深度清洁不仅能够确保视觉的清晰…

【解决】Unity Build 应用程序运行即崩溃问题

开发平台:Unity 2021.3.7f1c1   一、问题描述 编辑器 Build 工程结束,但控制台 未显示 Build completed with a result of Succeeded [时间长度] 信息。该情况下打包流程正常,但应用程序包打开即崩溃。   二、问题测试记录 测试1&#xf…

必背!!2024年软考中级——网络工程师考前冲刺几页纸

距离软考考试的时间越来越近了,趁着这两周赶紧准备起来 今天给大家整理了——软考网络工程师考前冲刺几页纸,都是核心重点,有PDF版,可打印下来,每天背一点。 计算机总线分类 ①总线的分类:数据总线、地址总…

商城免费搭建之java商城 java电子商务Spring Cloud+Spring Boot+mybatis+MQ+VR全景

1. 涉及平台 平台管理、商家端(PC端、手机端)、买家平台(H5/公众号、小程序、APP端(IOS/Android)、微服务平台(业务服务) 2. 核心架构 Spring Cloud、Spring Boot、Mybatis、Redis 3. 前端框架…

【js刷题:数据结构链表之设计链表】

设计链表 一、题目二、题解 一、题目 二、题解 // 定义节点类,每个节点都有一个值和一个指向下一个节点的引用 class LinkNode{constructor(val,next){ // 构造函数,接收节点值和下一个节点的引用this.valval // 节点的值this.nextnext // 指…

班组建设门道多,企业管理咨询公司助你轻松上手!

班组作为企业的基本单元,其建设水平直接关系到企业的整体运营效率和员工的工作积极性。那么,如何有效地进行班组建设?班组建设又有啥门道呢?本文,深圳天行健企业管理咨询公司将从多个角度探讨这一问题,以期…

牛客热题:二叉树的最大深度

📟作者主页:慢热的陕西人 🌴专栏链接:力扣刷题日记 📣欢迎各位大佬👍点赞🔥关注🚓收藏,🍉留言 文章目录 牛客热题:二叉树的最大深度题目链接方法一…

算法day06

第一题 1658. 将 x 减到 0 的最小操作数 如题上述: 本题原来的意思给定一个数字x,从数组的左边或者右边 使用x减去数组中的数字,直到减去最后一个数字为0时,返回最小的操作次数;如果最终减去的数组中的数字之后不能得…