【hello Linux】动静态库

news2024/11/15 9:12:52

目录

1. 了解动静态库

1. ldd 命令的使用

2. C语言库与C++语言库

3. 库的分类

4. 库的命名

5. 库的内容

2. 静态库的制作和使用

1. 静态库的制作

2. 静态库的使用

3.动态库的制作和使用

1. 动态库的制作

2. 动态库的使用


Linux🌷 

1. 了解动静态库

1. ldd 命令的使用

我们使用C语言编写了一个test1.c的源程序,将test1.c进行编译生成test1的目标文件;

使用 ldd 可执行文件名 命令查看该可执行程序依赖的动态库;

进而我们对依赖的库进行了查看,发现该库其实是一个软链接,链接的文件是一个可执行文件;

因此我们便可以得出结论:

库在Linux中也是一个文件。

 2. C语言库与C++语言库

我们使用C语言编写了test1.c文件,查看编译生成的目标文件test1依赖的库如下所示:

 使用C++编写了一个test2.cc文件,查看编译生成的目标文件test2依赖的库如下所示:

 在这里要提一下:

 在Linux中,后缀为  .cc   .cpp   .cxx 都表示C++文件。

3. 库的分类

一般库分为两种:动态库 和 静态库;

在Linux中:

  • 如果是动态库:库文件是以  .so  作为后缀的;
  • 如果是静态库:库文件是以  .a  作为后缀的。

我们平常使用  gcc -o 目标文件名 待编译的文件名  编译是默认以动态方式链接的;

若想以静态方式链接则使用如下命令: gcc -o 目标文件名 待编译的文件名 -static 

我们使用的服务器一般没有内置语言的静态库,只有动态库,需要yum安装C/C++静态库。

sudo yum install glibc-static        
sudo yum install libstdc++-static

我们对test1.c文件分别进行了动态和静态编译;

经过查看发现静态生成的可执行文件大小大于动态生成的可执行文件 

我们便可以在这里说一下动静态编译生成目标文件的区别:

静态编译:将库里对应的模块拷贝至目标文件,此后运行不再依赖库,可移植性好;

动态编译:程序在运行的时候才去链接动态库的代码,多个程序共享使用库里的代码,此后运行还

要依赖库,可移植性差;

在这里要提一下:

Linux中一些命令也是依赖动态库的,若删掉动态库,则这些命令也无法执行,你的shell就可能会

崩溃;

我们还可以使用 file 命令查看可执行文件的类型: 

4. 库的命名

动态库:lib库名.so[其他内容]  

静态库:lib库名.a[其他内容]  

注意:

库的真正名字为:上述中的库名

5. 库的内容

我们试着打开上述标准的C语言库,发现是二进制的:

库其实就是封装好的一些函数的声明及实现的集合,供用户调用。

其实一套完整的库包含三个内容:

1. 头文件(里面写函数声明);

2. 库文件本身(里面是函数实现);

3. 说明文档;

头文件:是  .c  .cc  文件(不对其进行编译,使用语言写出来的文件,说明库中暴露出来的方法

的基本使用!)

库文件本身:是编译生成的  .o   的二进制文件的打包(隐私函数的具体实现)

如果有别人想使用你的函数,你便可以制作一个动态或静态库给他~

2. 静态库的制作和使用

1. 静态库的制作

目标:制作一个能进行加法和减法的库;

1. 我们使用声明和定义相分离的方式写了四个代码:

具体内容如下:

2. 对书写函数实现的  .c  文件进行编译生成  .o   文件;

 3. 打包生成的  .o  文件;

ar -rc [生成的.a文件名] [要打包的.o文件名]

//ar是gnu归档工具,rc表示(replace and create)

4. 查看打包好的  .a   文件;

ar -tv [生成的.a文件名]

//t:列出静态库中的文件
//v:显示详细信息

 5. 静态库

静态库便是刚才打包  .a  文件和函数声明  .h  文件的集合

my_math_lib便可称为一个静态库。 

2. 静态库的使用

目标:如下所示,我们想要利用生成的库编译test.c文件

 1. test.c 文件内容如下:

 2. 编译test.c文件

gcc [待编译的.c文件] -I[头文件搜索路径] -L[库文件的搜索路径] -l[要链接库名]

 注意:

第一个   -I  是因为:编译器并不会查找你同级目录下目录中有啥, 因此必须要带-I;

第三个  -l    中的库名必须是去掉 lib开头 和  .a/.so 结尾的中间部分。

静态库的制作和使用就到此结束,此后便可以直接将包含静态库和.h的目录丢给别人,别人便可以

使用库中的函数。

不光静态库可以制作,动态库也可以。

3.动态库的制作和使用

1. 动态库的制作

 目标:制作一个能进行加法和减法的库;

1. 我们使用声明和定义相分离的方式写了四个代码:

具体内容如下:

上述从静态库的制作中拷过来的!!!😁

2. 对书写函数实现的  .c  文件进行编译生成  .o   文件;

gcc -fPIC -c [要编译的.c文件]

与静态库的制作不同,动态库的编译时要加 -fPIC :产生位置无关码;

  3. 打包生成的  .o  文件;

gcc -shared -o [将形成的动态库名] [编译生成的.o文件]

 4. 动态库

动态库便是刚才打包  .so  文件和函数声明  .h  文件的集合

test便为可以使用动态库。

2. 动态库的使用

目标:如下所示,我们想要利用生成的库编译test.c文件

  1. test.c 文件内容如下:

 2. 编译test.c文件

gcc [待编译的.c文件] -I[头文件搜索路径] -L[库文件的搜索路径] -l[要链接库名]

编译与静态库都一样,但在运行前还有一步工作;

3. 导环境变量

export LD_LIBRARY_PATH=动态库的路径 	#导入环境变量

为什么要导入环境变量?

在上述编译时,我们指明了库的.h所在及库的文件所在,所以编译不会报错;

运行的时候加载器还是不知道它们在哪儿,因此导入变量告诉加载器动态库的位置;

注意:这个环境变量只在本次会话有效;


告诉加载器动态库位置的方法有多种,但上述方法是最为推荐的!!

如果想知道其他方法,请看下方博客!!!

https://blog.csdn.net/qq_54851255/article/details/125807460?spm=1001.2014.3001.5502

 总结:

如果只提供静态库,我们只能将我们的库,静态链接到我们的程序中—>静态使用;

如果只提供动态库,我们只能将我们的库,采用动态链接到我们的程序中—>动态使用;

我们在Linux中使用gcc编译器默认是采用动态连接的,但若在后面加-static则采用静态链接,

本质上是提供了两种版本的库,加上-static只是区分静态或动态链接的方式罢了,不是因为只有动

态库加上-static后就能静态链接的!!!

坚持打卡!😃

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

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

相关文章

JavaScript 鼠标事件监听触发时机触发顺序

有时间整理下鼠标的监听事件,目前汇总到的鼠标监听事件以下10个: 目录 1. click 2. dblclick 3.contextmenu 4.mousedown 5.mouseup 6.mouseenter 7.mouseleave 8.mouseover 9.mouseout 10.mousemove 先说下触发时机和作用键(左键…

九州云出席全球分布式云大会,基于5G MEC的车路协同创新引关注

4月20日,以“云智相生”为主题的2023全球分布式云大会北京站在北京成功召开。本次大会作为AIGC数智中国科技周的重要组成部分,聚焦分布式云和人工智能,探讨分布式云如何更好地支持人工智能发展,打造MaaS(模型即服务&am…

2023年4月中旬值得关注的几个AI模型:Dollly2、MiniGPT-4、LLaVA、DINOv2

AI模型的发展速度令人惊讶,几乎每天都会有新的模型发布。而2023年4月中旬也有很多新的模型发布,我们挑出几个重点给大家介绍一下。 Dolly-v2 MiniGPT-4 LLaVA DINOv2 Dolly-v2 Dolly是EleutherAI开源的一系列大语言模型,EleutherAI认为…

vue的diff算法原理

diff 概念diff比较流程头头尾尾头尾尾头比对查找过程 与vue3的区别 diff 概念 vue基于虚拟DOM做更新,diff的核心就是比较两个虚拟节点的差异。 vue的diff算法是平级比较,不考虑跨级比较的情况。内部采用深度递归 双指针的方式进行比较 diff比较流程 先…

文本挖掘 实践笔记

文本挖掘流程:(How) 文本预处理->特征提取->文本分析->可视化展示 文本预处理:包括文本清洗、分词、词性标注等 特征提取:将文本转化为词频、TF-IDF、embedding向量等 文本分析:利用统计学或机器学习的知识,做聚类、情感识别等 可视化展示:帮助人们更好…

Java版本电子招标采购系统源码:营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展

营造全面规范安全的电子招投标环境,促进招投标市场健康可持续发展 传统采购模式面临的挑战 一、立项管理 1、招标立项申请 功能点:招标类项目立项申请入口,用户可以保存为草稿,提交。 2、非招标立项申请 功能点:非招标…

Pandas技术重点来了

Pandas库建立在NumPy之上,并为Python编程语言提供了易于使用的数据结构和数据分析工具。 1.安装及调用 pip install pandasimport pandas as pd 一种能够保存任何数据类型的一维标记数组 >>> s pd.Series([3, -5, 7, 4], index[a, b, c, d]) 一种具有潜…

第八届cccc团体程序设计天梯赛——个人参赛总结——无代码纯粹的参赛总结

第八届cccc团体程序设计天梯赛——个人参赛总结——无代码纯粹的参赛总结 目录 第八届cccc团体程序设计天梯赛——个人参赛总结——无代码纯粹的参赛总结引言~介绍一下cccc天梯赛(选读)开篇介绍(以下是个人经历部分的分享)赛前准备…

其他品牌的触控笔能用在ipad上?性价比高的触控笔合集

随着平板电脑在学校、办公室等领域的广泛应用,越来越多的人需要一支出色的电容笔。虽然苹果原装的电容笔很给力,但是其的价格实在是太贵了,仅仅把它用于在纸上写写字,实在是太可惜了。所以,哪个电容笔更便宜&#xff1…

密歇根大学Python系列之一:零基础 Python 入门

密歇根大学计算机专业注重将计算机科学理论与实践相结合,旨在帮助学生全面掌握计算机科学的基础理论和实践技能: 1.计算机程序设计:编程技能和常见编程语言,如C和Java和Python等; 2.数据结构和算法:数据结…

2023年能源与环境工程国际会议(CFEEE 2023)

会议简介 Brief Introduction 2023年能源与环境工程国际会议(CFEEE 2023) 会议时间:2023年9月1日-3日 召开地点:中国三亚 大会官网:CFEEE 2023-2023 International Conference on Frontiers of Energy and Environment Engineering 由三亚纵横…

手撕八大排序算法(解析源码+图解)

八大排序算法 文章目录 八大排序算法一、插入排序1.代码实现2.思路图解 二、希尔排序1.代码实现2.思路图解 三、选择排序(优化版)1.代码实现2.思路图解 四、堆排序1.代码实现2.思路图解 五、冒泡排序1.代码实现2.思路图解 六、快速排序1.递归版本2.非递归版本3.快速排序的两个优…

Android之 Bitmap使用

一,简介 1.1 Bitmap是一种图片在内存中的表现形式,不管是png,还是jpg最终都是以bitmap的形式显示到控件上面。 Bitmap是一种位图,位图​是点阵图像​或栅格图像,是由称作像素(图片元素)的单个…

C++篇----类、封装、类访问权限、类实例化

文章目录 一、面向过程和面向对象二、类 一、面向过程和面向对象 c语言是面向过程的编程语言 c是面向对象的编程语言 面向过程:关注过程,对于求解问题的不走,调用函数逐步解决问题 就洗衣服来说:洗衣服需要放水,倒洗衣…

PCL点云库(2) — IO模块

目录 2.1 IO模块接口 2.2 PCD数据读写 (1) PCD数据解析 (2)PCD文件读写示例 2.3 PLY数据读写 (1)PLY数据解析 (2)PLY文件读写示例 2.4 OBJ数据读写 (1&#xff…

QMS-云质说质量 - 10 我和我的客户投诉(2) - 客户逐利 驱除良币

云质QMS原创 转载请注明来源 作者:王洪石 上策伐谋 中策伐交 前面发过一篇关于客户投诉的文章“逢年过节要祈祷”,引起了很多质量人的共鸣,特别是汽车零部件行业曾经和正在负责客诉的质量同行们。 真实的产品质量问题,是否发生只…

Linux-初学者系列2——用户组管理和权限管理

用户组管理和权限管理 Linux-初学者系列2_用户组管理和权限管理一、所有者1、查看文件的所有者指令 2、修改文件所有者指令实操 二、组创建语法指令:实操: 三、所在组1、查看文件/目录所在组基本指令:实操: 2、修改文件所在组基本…

【读书笔记】高效能人士的7个习惯

高效能人士的7个习惯-史蒂芬柯维 个人成功1. 积极主动(BE PROACTIVE)2. 以终为始(BEGIN WITH THE END IN MIND)3. 要事第一(PUT FIRST THINGS FIRST)个人成功总结 集体成功4. 双赢思维(THINK WI…

flex布局属性详解

Flex布局 flex-directionflex-wrapflex-flowjustify-contentalign-itemsalign-content其他orderflexalign-self 含义:Flex是Flexible Box的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性。 flex-direction flex-direction属性决定主轴的方向&…

服务(第十二篇)LVS-DR模式

数据包流向分析: (1)客户端发送请求到 Director Server(负载均衡器),请求的数据报文(源 IP 是 CIP,目标 IP 是 VIP)到达内核空间。 (2)Director Server 和 Re…