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

目录

一: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 文件名    读取可执行程序的对应二进制构成 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

杀杀杀杀杀杀杀杀杀

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,滤波估计、多传感器信息融合,机器学习,人工智能等相关领域的知识和技术。 …

GRFB-UNet:一种新的多尺度注意力网络,用于铺路分割

不同场景下的带注释的触觉铺装示例: GRFB-UNet网络结构: GRFB模块的结构: 铺路在视障人士的旅行中起着至关重要的作用。因此,识别铺装的形状和位置以支持视障人士的移动性是相当有意义的,而视觉分割技术就适合这项任务。为了有效提高触觉铺装分割的精度和鲁棒性,…

Netty核心组件介绍

Netty是一款用于创建高性能网络应用程序的高级框架。Netty的核心组件如下: Channel回调Future事件和ChannelHander Channel channel是Java NIO的一个基本构造。可以把Channel看作是传入或传出数据的载体。它可以被打开或关闭,连接或断开连接。 回调 …

揭秘抖音快速涨10000有效粉的方法——巨量千川投流打造真实粉丝快速增长

随着短视频平台的流行,越来越多的用户开始在抖音上展示自己的才艺和生活。然而,在这个庞大的用户群体中如何迅速地涨粉成为了抖友们普遍关注的问题。今天,我们将揭秘一种被全网搜索的抖音快速涨粉方法——巨量千川投流,官方真实流…

揭秘!你的电商产品为何滞销?同行火爆销售的7大原因!

同样做电商,但自家产品销量不如竞对同行,可能的原因有多种,以下是店雷达总结7个可能的原因和对策: 一、市场竞争分析不足 未能准确识别并分析竞争对手的产品、定价、营销策略等关键信息,导致自身产品无法脱颖而出。 …

深度解析YOLOV9,目标检测算法(附论文和源码)|

目录 一、YOLOV9 1、概述: 2,论文摘要: 输入数据在前馈过程中可能会有不可忽略的信息丢失。这种信息丢失会导致梯度流出现偏差,而梯度流又被用于更新模型。上述问题会导致深度网络在目标和输入之间建立不正确的关联&#xff0c…

算法分析与设计复习__递归方程与分治

总结自:【算法设计与分析】期末考试突击课_哔哩哔哩_bilibili 1.递归,递归方程 1.1递归条件: 1.一个问题的解可以分解为几个子问题的解; 2.这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样; 3.存在…

【Git教程】(十八)拆分大项目 — 概述及使用要求,执行过程及其实现,替代解决方案 ~

Git教程 拆分大项目 1️⃣ 概述2️⃣ 使用要求3️⃣ 执行过程及其实现3.1 拆分模块版本库3.2 将拆分出的模块作为外部版本库集成 4️⃣ 替代解决方案 通常软件项目都是由单体小型系统开始的,在开发过程中项目规模和团队人员不断扩大, 将项目模块化会显得…

Redis-持久化操作-AOF

持久化操作-AOF AOF是什么? 以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只允许加文 件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之…

git入门操作

一、介绍 Git是一个开源的分布式版本控制系统,由Linus Torvalds创建,用于有效、高速地处理从小到大的项目版本管理。 二、注册Git代码托管平台账号 以下几个平台可供选择: Gitee: https://gitee.com/(国内) Gitee(码云&…

从丢失到找回:手机相册恢复实战教程

“之前因为手机延迟把三千多张相片都删了,花了几个小时找文档,最后也没找到。对于爱拍照的朋友来说,照片被误删或不见真的会超级难过!请问大家有什么好方法能够恢复照片吗?” 在数字时代,手机相册成为了我…

PLC的ST语言实现IIR butterworth低通滤波器

参考 Butterworth Filter Design in C – The Code Hound matlab代码,创建一个fc0.1的4阶butterworth低通滤波器。 format long[b,a] butter(4,0.1,low)input1 [1,2,3,1,2,3,1,2,3,0,0]; output filter(b,a,input1)过滤input1的结果为 output Columns 1 throu…

嵌入式基础课程配套电机FOC伺服电机开发板AT32F403磁编码IMU姿态

嵌入式基础课程配套电机FOC伺服电机开发板AT32F403磁编码IMU姿态 带你入门嵌入式有二十多年开发经验的老技骨做技术支持整个开发包硬件包括电机2205,支持12V到24V宽输入,配套12V2A电源。包装原理图和PCB嵌入式软件嵌入式基础课程 带你入门嵌入式 电机FO…

免费SSL证书怎么签发

大家都知道SSL证书好,作用大,安全性高,能加权重,等保必须的参考值。但是如何选择合适且正确的证书也是至关重要的,网站更适合单域名证书、多域名证书、泛域名证书、还是多域名通配符证书。 首先大家要清楚&#xff0c…

MATLAB车辆动力学建模 ——《控制系统现代开发技术》

引言 在上这门课之前,我已经用过CasADi 去做过最优化的相关实践,其中每一步迭代主要就是由:对象系统优化求解两部分组成的。这里我们重点介绍 “对象系统”如何去描述 ,因为它是每一步迭代中重要的一环——“优化求解”会获得控制…

Java逐层解析JSON的内存占用分析

哈喽,大家好,我是木头左! 在当今的软件开发世界中,JSON(JavaScript Object Notation)已经成为了数据传输和存储的事实标准。由于其轻量级且易于人类阅读的特点,JSON被广泛用于Web服务、移动应用…

【制作100个unity游戏之26】unity2d横版卷轴动作类游戏5(附带项目源码)

最终效果 系列导航 文章目录 最终效果系列导航前言三段攻击攻击设置只对敌人造成伤害限制可以移动攻击问题 角色连续按四下攻击,最后会多a一下问题:站在原地连续攻击野猪,只有第一下攻击野猪才掉血,后面的攻击野猪不掉血源码完结 …

一图流解释Java中线程状态的转换

目录 一.Java中的几大线程状态 二.线程之间的相互转换 ▐ NEW --> RUNNABLE ▐ RUNNABLE <--> WAITING ▐ RUNNABLE <--> Timed Waiting ▐ RUNNABLE<--> BLOCKED ▐ RUNNABLE<-->TERMINATED 一.Java中的几大线程状态 简单来说线程可以处于…

美团小程序mtgsig1.2逆向

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018601872 本文章未…

网络安全等级保护在工业控制系统中的应用

工业控制系统(Industrial Control Systems,ICS)&#xff0c;是由各种自动化控制组件和实时数据采集、监测的过程控制组件共同构成。其组件包括数据采集与监控系统(SCADA)、分布式控制系统(DCS)、可编程逻辑控制器(PLC)、远程终端(RTU)、智能电子设备(IED)&#xff0c;以及确保各…