【Linux】动/静态库的创建和使用

目录

一、动/静态库的概念回顾:

二、动态库与静态库的区别:

三、静态库的创建与使用:

1、Linux静态库命名规则:

2、静态库的创建和使用:

四、动态库的创建与使用:

1、Linux动态库命名规则:

2、动态库的创建和使用:


一、动/静态库的概念回顾:

        从上一章节(基础I/O)中我们讲到,库其实就是已经写好的、成熟的、可以直接使用的代码,库里面封装了数据和函数,可以直接提供给用户进行调用。

而所谓的静态、动态是指在链接阶段如何处理库,链接成可执行文件。

编译过程:

二、动态库与静态库的区别:

静态库:

        静态库在链接阶段,会将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中(通俗点就是静态库在编译的链接阶段与目标文件一起打包生成可执行文件,成为可执行文件的一部分)。所以当多个应用程序同时引用一个静态库函数时就会在内存中调用函数的多个副本,大大增加可执行文件的体积,其优点是节省编译时间

动态库:

        动态库在程序编译时并不会被链接到目标代码中,而是在程序运行是才被加载和链接。所以被调函数在内存中只有一个副本、可以实现进程之间资源的共享,且动态库可以在程序运行期间释放动态库所占用的内存。

        动态链接所调用的函数代码并不会拷贝到可执行文件中,也就是说可执行文件与动态库是分开的,只会在可执行文件中加入所调用函数的描述信息,当程序装载进内存中运行时,在OS的管理下会在程序与对应的动态库之间建立链接关系,当要执行所调用动态库的函数时,会根据链接产生重定位信息,然后去执行执行动态库中对应的函数。

三、静态库的创建与使用:

1、Linux静态库命名规则:

Linux的静态库的命名规范为:"lib[xxx].a"

lib为前缀,中间的xxx为这个静态库的名字,.a为拓展名,例如一个名为test的静态库为:libtest.a

2、静态库的创建和使用:

前面说到:静态库是在链接阶段将汇编生成的目标文件.o与引用到的库一起链接打包到可执行文件中。我们可以试想一下静态库会与汇编生成的目标文件一起链接为可执行文件,那么静态库必定跟.o文件格式相似。其实一个静态库可以简单看成是一组目标文件(.o/.obj文件)的集合,即很多目标文件经过压缩打包后形成的一个文件。

下面用一段简单的代码编译成静态库:

函数声明: add.h
int add(int x, int y);函数定义: add.cpp
int add(int x, int y)
{return x + y;
}

Linux下使用ar工具、Windows下vs使用lib.exe,将目标文件压缩到一起,并且对其进行编号和索引,以便于查找和检索。

一般创建静态库的流程如下:

通过上面的流程图可以看到,我们要先把代码文件编译成目标文件.o

g++ -c add.cpp

然后通过ar工具将目标文件打包成.a静态库文件(将add.o打包成libadd.a)

ar -crv libadd.a add.o

静态库的使用:

这里我们写一段使用库中函数的代码用来测试:

Linux下使用静态库一般为:

g++ Test.cpp -L ./ -l add

选项:

-L:表示要连接的库所在目录

-l:指定链接时所需要的库,去掉前缀lib和后缀,如上就是libadd.a去掉前后缀

此时我们删掉静态库可以发现:程序还是一样能正常运行,因为静态库已经成为这个可执行文件的一部分了,不需要依赖外界了(如下图

四、动态库的创建与使用:

1、Linux动态库命名规则:

Linux的动态库的命名规范为:"lib[xxx].so"

lib为前缀,中间的xxx为此动态库的名字,so为拓展名,例如一个名为test的动态库为:libtest.so

2、动态库的创建和使用:

前面说到:动态库在程序编译时并不会被连接到目标代码中,而是在程序运行是才被载入。所以动态库只需要在内存中只存在一份拷贝即可,就能有效避免静态库浪费空间的问题,且对程序进行更新也只需要更新动态库,增量更新即可。

针对于实际库文件,每个共享库都有个特殊的名字"soname"。在程序启动后,程序会通过这个名字来告诉动态加载器该载入哪个共享库。

在文件系统中,soname仅是一个链接到实际动态库的链接。对于动态库而言,每个库实际上都有另一个名字给编译器来用。它是一个指向实际库镜像文件的链接文件 (lib+soname+.so)

创建动态库文件:这里我直接复用上面的代码

函数声明: add.h
int add(int x, int y);函数定义: add.cpp
int add(int x, int y)
{return x + y;
}

生成动态库的命令为:g++ -fPIC -shared -o libadd.so add.cpp

选项:

-fPIC:创建与地址无关的编译程序(pic:position independent code),实现在多个应用程序间进行共享。

-shared:指定生成动态链接库。(生成.o文件)

-o:重命名,将打包出的库文件命名成libadd.so     

其实将整条命令拆分一下就是: 

g++ -fPIC -c add.cpp                            (生成.o文件)

g++  -shared -o libadd.so add.o         (生成.so库) 

注意下面这张图的a.out并不是动态库生成的,是上面静态库生成的。

动态库的使用:(Test.cpp代码还是和上面一样)

g++ Test.cpp -L ./ -l add    (引用动态库编译成可执行文件跟静态库的方式一样)

但是此时我们运行生成的可执行文件会发现这样子会报错!!!

这是因为编译器只会去库目录和环境变量中找动态库,Linux环境下的库文件一般都放在 /lib 或者 /usr/lib 目录下,所以我们得要让程序能找到动态库。

解决方法:

1、将生成的动态库拷贝到 /usr/lib 或者 /lib 目录下

(这种方法虽然简单直接,但是不推荐用这种方法,因为这会污染系统的库源)

2、修改环境变量 LD_LIBRARY_PATH

(环境变量 LD_LIBRARY_PATH是动态库的搜索路径,一般情况下为空,可执行文件运行时,会去这个环境变量中搜索动态库路径,但是注意:新建终端或者重启就会失效

3、建立软链接:

(直接在liblib64目录下建立一个指向这个动态库的一个软链接,推荐这种用法

(对于32位程序一般会链接到 /usr/lib 中的库。而64位程序则会链接到 /usr/lib64 中的库。但也有例外情况,例如:如果64位系统上的某个64位程序需要向后兼容32位库,它可能仍然会链接到 /usr/lib 中的库。)

补充:可以通过ldd 命令可以查看当前执行文件所链接的动态库

如果将对应需要的动态库删除的话那这里(红色框处)就会显示找不到库,自然程序也就无法运行了

如下:如果删除动态库,程序就会无法运行:

动态库更新:

更新时只需更新动态库即可,就不需要连同使用库的应用程序一起进行编译了,如下:更改了+的逻辑变成-,只需对动态库进行重新编译就可以实现程序更新了:

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

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

相关文章

【python】pop()函数

python pop() ,如何在Python的列表或数组中移除元素 使用 pop() 从列表中删除元素 pop() 语法概述 pop() 方法的语法如下: list_name.pop(index)list_name:列表变量名;内置的 pop() 方法仅需要一个可选参数;可选参…

Windows若要成为最受欢迎的操作系统,则需要解决5个问题

序言 Windows正变得与我在过去几十年中第一次喜欢和使用的操作系统大不相同,但尽管我觉得它偏离了崇高的道路,如果我可以成为CEO一天,那么我会改变以下五件事,让世界上最受欢迎的操作系统重回正轨。 非必要更新的永久延期 多年来…

鸿蒙HarmonyOS自定义组件开发和使用

自定义组件的介绍 在开发和使用自定义组件直接,我们需要了解什么是自定义组件? 在ArkUI中,UI显示的内容均为组件,由框架直接提供的称为系统组件,由开发者定义的称为自定义组件。在进行 UI 界面开发时,通常…

坑——python的redis库的decode_responses设置

python的redis库查询返回的值默认是返回字节串,可以在redis.Redis()方法中通过设置decode_responses参数,让返回值直接是字符串; 查询返回字节串是因为Redis()方法中decode_responses默认值是False: 设置decode_responses为True就…

【从零开始实现联邦学习】

1. 环境配置如下 python3.7pip install torchpip install torchvision 2. 代码如下 原书的代码存在一点bug,现已被作者修复 Client端代码如下 import torch.utils.dataclass Client(object):def __init__(self,conf,model,train_dataset,id1):self.conf conf …

为什么不再推荐使用 VRTK 4?

引言 VRTK (Virtual Reality Toolkit) 发布于2016年,初期受到了广大开发者的欢迎并被广泛采用。但是随着 VR 开发生态的发展,这款工具逐渐失去了最初的光芒。本文试图通过几个维度的分析,解释为什么目前不推荐使用 VRTK 进行开发的理由&…

Eigen中关于四元数的常用操作

四元数(Quaternion)是一种数学工具,广泛用于计算机图形学、机器人学和物理模拟中,特别适合处理三维旋转。Eigen库是一个高性能的C数学库,提供了丰富的线性代数功能,其中就包括对四元数的支持。 1. 为什么选…

mklink

文章目录 mklink概述笔记备注END mklink 概述 看一个开源工程中,有一个.bat脚本,用来建立符号链接。 用的是mklink, 试试,比快捷方式好用。 笔记 测试环境 win10x64-22H2 准备测试用的文件 D:\my_tmp\dir1\readme.txt mklink的命令行帮助…

Windows平台使用S3Browser连接兼容的对象存储

本文记录了在Windows平台使用S3Browser连接兼容的对象存储的过程 一、安装S3Browser 1、下载 S3Browser官网:https://s3browser.com/ 直接下载:https://s3browser.com/download/s3browser-11-6-7.exe 2、安装 3、同意授权后确定安装目录 4、勾选立即…

第7章 Redis的噩梦:阻塞

文章目录 前言1 发现阻塞2.内在原因2.1API或数据结构使用不合理2.1.1如何发现慢查询2.1.2.如何发现大对象 2.2 CPU饱和2.3 持久化阻塞2.3.1fork阻塞2.3.2.AOF刷盘阻塞2.3.3.HugePage写操作阻塞 3 外在原因3.1CPU竞争3.2 内存交换 前言 Redis是典型的单线程架构,所有…

Studying-代码随想录训练营day23| 39.组合总和、40.组合总和II、131.分割回文串

第23天,回溯part02,回溯两个题型组合,切割(ง •_•)ง💪 目录 39.组合总和 40.组合总和II 131.分割回文串 总结 39.组合总和 文档讲解:代码随想录组合总和 视频讲解:手撕组合总和 题目:…

【Qt】信号和槽机制

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞 关注支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; &#x1f525;c系列专栏&#xff1a;C/C零基础到精通 &#x1f525; 给大…

WINDOWS+PHP+Mysql+Apache环境中部署SQLi-Labs、XSS-Labs、UPload-Labs、DVWA、pikachu等靶场环境

web渗透测试学习&#xff0c;需要自己搭建一些靶场&#xff0c;本人主要介绍在WINDOWSPHPMysqlApache环境中部署SQLi-Labs、XSS-Labs、UPload-Labs、DVWA、pikachu等靶场环境。以下是靶场代码下载的链接&#xff1a; pikachu靶场代码 链接&#xff1a;https://pan.baidu.com/s…

废品回收小程序开发:提高废品回收效率

当下&#xff0c;废品回收已经成为了热门行业&#xff0c;家家户户几乎都会进行废品回收&#xff0c;无论是废纸盒还是塑料瓶等&#xff0c;都会送到废品回收站。不过&#xff0c;随着互联网的快速发展&#xff0c;传统的回收模式出现了大量的局限性&#xff0c;已经不能满足大…

探索Android架构设计

Android 应用架构设计探索&#xff1a;MVC、MVP、MVVM和组件化 MVC、MVP和MVVM是常见的三种架构设计模式&#xff0c;当前MVP和MVVM的使用相对比较广泛&#xff0c;当然MVC也并没有过时之说。而所谓的组件化就是指将应用根据业务需求划分成各个模块来进行开发&#xff0c;每个…

领夹麦克风哪个品牌音质最好?主播一般用什么麦克风?麦克风推荐

在这个充满创意与表达的时代&#xff0c;无线领夹麦克风以其独特的魅力&#xff0c;成为了声音创作者们的得力助手。它小巧便携&#xff0c;功能强大&#xff0c;无论是日常拍摄、直播互动还是专业演出&#xff0c;都能轻松应对&#xff0c;让你的声音随时随地清晰传递。那么&a…

# Kafka_深入探秘者(10):kafka 监控

Kafka_深入探秘者&#xff08;10&#xff09;&#xff1a;kafka 监控 一、kafka JMX 1、JMX &#xff1a;全称 Java Managent Extension 在实现 Kafka 监控系统的过程中&#xff0c;首先我们要知道监控的数据从哪来&#xff0c;Kafka 自身提供的监控指标(包括 broker 和主题的…

管理的核心是管人,管人的核心就是这3条,看懂的是高手

管理的核心是管人&#xff0c;管人的核心就是这3条&#xff0c;看懂的是高手 一&#xff1a;管欲 每个人都有欲望&#xff0c;无可厚非。管理者的任务就是利用欲望&#xff0c;管理欲望&#xff0c;通过欲望来达到管人的目的。 最需要管理的就是以下两种&#xff1a; 1、金…

普乐蛙景区9d电影体验馆商场影院娱乐设备旋转飞行影院

今天与大家聊聊VR娱乐新潮流&#xff0c;我们普乐蛙的新品——旋转飞行影院&#xff01;裸眼7D环幕影院&#xff0c;话不多说上产品&#xff01;我们通过亲身体验来给大家讲讲这款高性价比新品的亮点。 想象一下走上电动伸缩梯&#xff0c;坐进动感舱&#xff0c;舱门缓缓合上&…

点击获取2024SIAL西雅国际食品展上海展后报告

随着2024年SIAL 西雅展&#xff08;上海&#xff09;的圆满落幕&#xff0c;我们不仅见证了一场食品与饮料行业的国际盛会&#xff0c;更是感受到了上海这座城市独有的魅力与活力。在这里&#xff0c;我们回顾了上海展的辉煌成就&#xff0c;同时&#xff0c;我们也满怀期待地展…