【Linux】:静动态库

静动态库

  • 一.静态库
    • 1.设计静态库
    • 2.生成静态库
    • 3.发布静态库
    • 4.使用静态库
  • 二.动态库
    • 1.设计动态库
    • 2.生成和发布动态库
    • 3.使用
  • 三.进程地址空间
    • 1.程序在加载前的地址
    • 2.程序在加载后的地址
    • 3.动态库的地址

一.静态库

程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库。

静态库链接格式:libxxx.a(前缀是lib,后缀是.a)

1.设计静态库

用mymath.h声明,mymath.c作为实现

在这里插入图片描述

在这里插入图片描述

2.生成静态库

在这里插入图片描述

第一行:形成一个库,叫做libmymath.a
第二行:依赖的文件mymath.o,并且把所有依赖的.o文件打包成一个.a文件(ar是生成静态库的指令,rc是releace和create,连起来就是把后面的文件打包到前面的文件里)
第三行:把所有依赖的源文件变成.o文件 最后进行清理**

在这里插入图片描述

在这里插入图片描述

这样库就形成了,总结一下就是把所需要的.o文件全部用ar打包成一个.a文件就行了。

3.发布静态库

创建include和mymathlib两个文件在lib里,在将所有的.h文件拷贝到include里,将所有.a文件拷贝到mymathlib里。
在这里插入图片描述

在这里插入图片描述

4.使用静态库

在这里插入图片描述

在这里插入图片描述

第一种使用方法

在这里插入图片描述

这里直接编译是会报错的,原因很简单。在编译时会进行头文件展开,那么第一件事情就是找到对应的头文件,而它会在默认的路径下查找,但默认的路径里很明显不包括我们自己写的库,所以必须指定路径。

1.-I 选项代表到指定目录下查找头文件
2.-L 选项代表到指定目录下查找库文件
3.-l 选项代表指定的库(库的名字去掉前缀和后缀)

在这里插入图片描述

在这里插入图片描述

第二种方法

gcc会默认在默认目录里搜索,那么我们可以自己把头文件和库拷贝到对应默认目录里(或者添加软链接)。

在这里插入图片描述

但是gcc只认c库里的文件,所以要使用第三方库依然要加-l选项。

在这里插入图片描述

二.动态库

动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。

动态库:前缀是lib,后缀是.so

1.设计动态库

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

接下来就用这两个源文件打包形成动态库。

2.生成和发布动态库

动态库的生成与静态库差别不大,这里将动静态库连起来使用。

shared: 表示生成共享库格式
fPIC:产生位置无关码(position independent code)

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

从上面看到一个.a库和一个.so库合并成了一个lib库。

3.使用

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

三.进程地址空间

1.程序在加载前的地址

当程序在磁盘里时有地址的概念吗?答案是有的,程序在加载到内存之前也是要有地址的概念。在平坦模式下,编址从0~4GB.

在这里插入图片描述

其实这些地址也被称为逻辑地址(虚拟地址),在程序未被加载前就已经存在地址了。

2.程序在加载后的地址

程序是可以在任意位置加入到内存,所以程序加载后必须有一个物理地址,由于程序在加载前就有了地址,所以程序在加载到物理内存里后实际上有两套地址。

那么cpu是如何找到程序的呢?

系统里有一个EIP寄存器,会保存该程序的入口地址,所以CPU只需要得到这个入口地址,就可以根据程序本身的逻辑地址正常执行代码了。

3.动态库的地址

动态库加载到物理内存后,毫无疑问需要通过页表映射到虚拟内存的共享区,那么具体映射到共享区的哪个位置呢?

在这里插入图片描述

1.由于一个动态库有不确定性,也就是说操作系统并不确定这个库是否会使用,使用的顺序,所以就不能给库一个固定的位置。换句话说该库应当是可以加载到共享区的任意位置的。

2.由上可以得出,库本身在编址并不使用绝对地址,而使用偏移量。

3.所以只需要提供该库的起始地址,通过偏移量就能执行所有代码。

4.在生成动态库时的fPIC(产生位置无关码)指令,就是告诉编译器使用偏移量进行编址。

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

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

相关文章

【算法练习Day48】回文子串最长回文子序列

​📝个人主页:Sherry的成长之路 🏠学习社区:Sherry的成长之路(个人社区) 📖专栏链接:练题 🎯长路漫漫浩浩,万事皆有期待 文章目录 回文子串最长回文子序列总结…

【文章学习系列之模型】DAGMM

本章内容 文章概况模型结构损失函数实验结果实验分析总结 文章概况 《Deep Autoencoding Gaussian Mixture Model for Unsupervised Anomaly Detection》是2018年发表于ICLR的一篇论文,该论文提出一种端到端的无监督异常检测方法DAGMM,取得了不错的效果…

数据结构-散列表

列表(Hash Table),又称哈希表,是一种数据结构,特点是:数据元素的关键字与其存储地址直接相关 例:有一堆数据元素,关键字分别为{19,14,23&#xff…

Ansys Lumerical | 用于增强现实系统的表面浮雕光栅

在本示例中,我们使用 RCWA 求解器设计了一个斜面浮雕光栅 (SRG),它将用于将光线耦合到单色增强现实 (AR) 系统的波导中。光栅的几何形状经过优化,可将正常入射光导入-1 光栅阶次。 然后我们将光栅特性导出为 Lumerical Sub-Wavelength Model …

【NI-DAQmx入门】触发相关

触发概述 触发采集为用户提供了两个主要好处:它对输入信号相对于触发事件进行计时,因此用户仅捕获感兴趣区域中的信号,从而节省硬件带宽和内存。 模拟触发和数字触发 模拟触发和数字触发的区别在于触发源的不同。数字触发是一种 TTL 信号&am…

压测工具主要功能是什么?该怎样选择?

压测工具是一类用于模拟并评估系统在不同负载条件下的性能的软件应用程序。通过模拟大量用户同时访问系统,压测工具能够帮助开发者识别系统的瓶颈、性能瓶颈以及潜在的故障点。这种实时、模拟的方式允许开发者在正式投入使用之前发现并解决问题,提高系统…

数据库操作入门:PyMongo 和 MongoDB 的基本用法

MongoDB MongoDB是一种流行的NoSQL数据库,它将数据存储在类似JSON的文档中,使数据库非常灵活和可扩展 PyMongo Python需要一个MongoDB驱动程序来访问MongoDB数据库。在本教程中,我们将使用MongoDB驱动程序 “PyMongo”。建议使用PIP来安装…

基于JavaWeb+SSM+Vue微信小程序校园兼职任务平台系统的设计和实现

基于JavaWebSSMVue微信小程序校园兼职任务平台系统的设计和实现 源码传送入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码传送入口 前言 随着社会的发展和全球疫情的冲击,大学生的就业形势越来越严峻。越…

数据结构与算法【递归】Java实现

递归 递归是一种解决计算问题的方法,其中解决方案取决于同一类问题的更小子集。 特点: 自己调用自己,如果说每个函数对应着一种解决方案,自己调用自己意味着解决方案是一样的(有规律的)每次调用&#xf…

算法——滑动窗口

什么是窗口?就是符合题目要求的区域内的数据,将每次符合数据的窗口内的数据记录下来,然后将窗口后移,寻找其他符合要求的数据,每次进入窗口和退出窗口都需要一定的要求 一、长度最小的子数组 LCR 008. 长度最小的子数…

element el-upload上传功能

2023.11.14今天我学习了如何使用el-upload: <!--drag设置可拖动--><!--accept".xlsx"设置上传的文件类型--><!--:limit1上传文件的最大个数--><!--:auto-upload"false"是否在选取后直接上传--><!--:before-upload"beforeU…

城市内涝对策,万宾科技内涝积水监测仪使用效果

随着城市化进程的加速&#xff0c;城市道路积水问题明显越来越多&#xff0c;给人们的出行和生活带来更多的不便。内涝积水监测仪作为高科技产品能够实时监测道路积水情况&#xff0c;为城市排水系统的管理和维护提供重要的帮助。 在城市生命线的基础设施规划之中&#xff0c;地…