【Linux】动态库|静态库|创建使用|动态库加载过程
目录
编辑
前言
静态库
为什么要使用库(形成原理 )
生成一个静态库
静态库的使用
动态库
生成一个动态库
动态库的使用
解决方法
动态库加载过程
编辑
前言
库(Library)是一种方式,可以将代码打包成可重用的格式(站在巨人的肩膀上),供其他程序调用。
库可以分为静态库(StaticLibraries)和动态库(Dynamic Libraries 或 Shared Libraries)
- 动态库:库文件,以.so为后缀(Windows中为.dll)
- 静态库:库文件,以.a为后缀(Windows中为.lib)
库的命名规则:lib库名.后缀
所以掐头去尾才是它的库名。使用gcc进行编译的时候,默认是采用的动态链接,如果要使用静态链接需要加上选项-static。
libc.alibstdc++.so.6所以这两个库名分别为c和stdc++
库中的内容都是一些被编译过但是还未被链接的目标文件(以.o或者.obj结尾的二进制文件)。
静态库
静态库在程序编译链接的时候将库的代码整合复制到可执行文件中的代码和数据中,生成的可执行程序在运行时将不再需要静态库,因此使用静态库生成的程序大小比较大;
为什么要使用库(形成原理 )
- 当我们需要程序功能提供给别人时,但又不想直接给出源码,我们可以将源文件汇编成二进制文件(二进制文件不会暴露源码)后,将头文件和二进制文件目标文件交给别人;
- 不仅如此,日常中将常用功能打包成库也可以提高效率
生成一个静态库
ar -rc 生成库的名字 源文件...
ar 命令是 gnu 的归档工具,常用于将目标文件打包为静态库,ar(archive)
- -r (replace):若静态库文件当中的目标文件有更新,则用新的目标文件替换旧的目标文件
- -c (create):建立静态库文件
一般静态库是以.a为后缀
以一个简单的运算为例
将函数定义的.c文件编译成二进制文件
使用ar命令,将这些二进制文件打包成静态库
静态库的使用
前面我们创建了一个简单的静态库;
当我们的程序依赖某个静态库时,链接器(linker)会将库中的相关文件整合到可执行文件中(前面提过),我们的test.c文件依赖库中的sub,sum函数,如果不链接库,只能一个个链接源文件
而现在我们已经将所需的函数打包成了静态库libmymath.a;
考虑使用以下指令:
gcc -o test.exe test.c -I ./mymath/include/ -L ./mymath/lib/ -lmymath
注:
- 编译器不知道所包含的头文件.h在哪,所以需要我们指定头文件的搜索路径;
- 头文件中只有函数的声明,没有函数定义,所以需要我们指定所要链接库文件的搜索路径;
- 编译器也不知道需要链接的库在哪里,是哪一个库,这还需要我们指定路径;因为库目录下可能有很多库文件;
- 平时所写的C/C++不需要这些选项可以直接编译,是因为我们写的库不在系统默认路径下;
- -I:指定头文件搜索路径(大写的i)
- -L:指定库文件搜索路径
- -l:指明需要链接库文件路径下的哪一个库(L的小写)
生成的文件很大,因为链接静态库后,该库中的所有数据和代码都存在可执行文件中,所以后续将静态库删除也不会影响程序的执行;
file查看文件
可以看到描述,我提供的明明是静态库,为什么是动态链接
- gcc 默认是动态链接的(建议行为),对于特定的一个库,究竟是动态链接还是静态链接,取决于你提供的是动态库还是静态库
- 一个可执行性程序不可能只依赖一个库函数,也就是说必须依赖多个库函数
- 但是,假设动静态库同时给你,编译器只能把静态库拷贝到可执行程序里面,然后只能进行动态链接,哪怕只有一个动态库剩下的全是静态库,链接依旧是动态链接
- 全部提供的是动态库,链接也是动态链接;提供有指定的静态库,再以静态的方式编译,这样链接就是静态链接
动态库
- 动态库(Dynamic Libraries)能够使多个程序共享同一份库代码,而不需要将这些代码复制到每个程序的可执行文件中,从而节省系统资源并便于维护和更新。
- 与静态库不同的是,动态库被链接后存在于进程的共享区域内,该区域内的数据和代码可以供多个进程使用。也就意味着,如果我们在生成可执行文件之后,将动态库删除,程序便会报链接错误。这是和使用静态库不一样的地方。
生成一个动态库
gcc -fPIC -c sub.c
gcc -fPIC -c sum.c
选项 -fPIC:表示生成位置无关码。
- 位置无关码的意思就是,生成的代码在内存中可以被加载到任何位置,而不是某个固定的地址。这种特性对于动态库尤其重要,因为动态库需要能够被多个不同的程序共享,并且每个程序可能将库加载到不同的地址空间。位置无关码的寻址方式为相对寻址,可以将代码中的所有指针认为是一个个偏移量,不同的程序给与它不同的初始地址,这样就能灵活的将库加载到其它的地方。
生成动态库时我们不必使用ar命令,使用 gcc 生成动态库即可,多加了一个选项 -shared
选项 -shared 表示 链接器 生成一个动态库而不是默认的可执行文件。生成的动态库文件以.so结尾。
动态库的使用
- 动态库是在运行时被访问的, 编译器能指定路径能找到动态库,不代表操作系统能找到;
- 静态库没有这样的问题是因为它是一次性工程,在链接阶段将所有的代码和数据都拷贝到程序内部了;
- 对于一个动态库,链接时要告诉编译器自己在哪,运行时要告诉操作系统在哪;
解决方法
- 安装到系统:
- 将我们自己的动态库拷贝到/lib里面,就能成功运行了:
- 建立软链接:
- 在/lib目录下建立软连接
- 命令行导入环境变量:
- 修改动态库默认路径的环境变量LD_LIBRARY_PATH:
- export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH
- 其中/usr/local/lib表示库路径
- 修改.bashrc配置文件,让环境变量永久生效
- 找到LD_LIBRARY_PATH配置项,并在其路径下添加库的路径,这样每次登录都会自动生效。
如果你发现你的./bashrc没有LD_LIBRARY_PATH那你可以自己手动加一个环境变量LD_LIBRARY_PATH过去:export LD_LIBRARY_PATH=/path/to/your/libs:$LD_LIBRARY_PATH
动态库加载过程
相关文章:
【Linux】动态库|静态库|创建使用|动态库加载过程
目录 编辑 前言 静态库 为什么要使用库(形成原理 ) 生成一个静态库 静态库的使用 动态库 生成一个动态库 动态库的使用 解决方法 动态库加载过程 编辑 前言 库(Library)是一种方式,可以将代码打包成可重用的格式(站…...
WebSocket 协议与 HTTP 协议、定时轮询技术、长轮询技术
目录 1 为什么需要 WebSocket?2 WebSocket2.1 采用 TCP 全双工2.2 建立 WebSocket 连接2.3 WebSocket 帧 3 WebSocket 解决的问题3.1 HTTP 存在的问题3.2 Ajax 轮询存在的问题3.3 长轮询存在的问题3.4 WebSocket 的改进 参考资料: 为什么有 h…...
二叉树节点问题
问题:设一棵二叉树中有3个叶子结点,有8个度为1的结点,则该二叉树中总的结点数为( 13)个 设某种二叉树有如下特点:每个结点要么是叶子结点,要么有2棵子树。假如一棵这样的二叉树中有m(m>0&…...
公司里的IT是什么?
公司里的IT是什么? 文章目录 公司里的IT是什么?1、公司里的IT2、IT技术3、IT行业4、IT行业常见证书 如果对你有帮助,就点赞收藏把!(。・ω・。)ノ♡ 前段时间,在公…...
【小程序爬虫入门实战】使用Python爬取易题库
文章目录 1. 写在前面2. 抓包分析 【🏠作者主页】:吴秋霖 【💼作者介绍】:擅长爬虫与JS加密逆向分析!Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Python与爬虫领域研…...
案例 —— 怪物出水
一,Ocean Setup 设置海洋Surface Grid(使用Large Ocean工具架) 调节默认Grid的大小尺寸及细分(使用非常小尺寸来测试);调整频谱输入点的多少,频谱Grid Size,波浪方向,速度…...
vue中使用print.js实现页面打印并增加水印
1.安装print.js npm install print-js --save2.在main.js文件中引入并注册(我使用的是print.js的源码文件,并且做了一修改) //引入 import Print from ./utils/print//注册 Vue.use(Print); //注册3.在页面中使用 <template> <div class&quo…...
计算机基础(Windows 10+Office 2016)教程 —— 第5章 文档编辑软件Word 2016(下)
文档编辑软件Word 2016 5.4 Word 2016的表格应用5.4.1 创建表格5.4.2 编辑表格5.4.3 设置表格 5.5 Word 2016的图文混排5.5.1 文本框操作5.5.2 图片操作5.5.3 形状操作5.5.4 艺术字操作 5.6 Word 2016的页面格式设置5.6.1 设置纸张大小、页面方向和页边距5.6.2 设置页眉、页脚和…...
简单洗牌算法
🎉欢迎大家收看,请多多支持🌹 🥰关注小哇,和我一起成长🚀个人主页🚀 ⭐目前主更 专栏Java ⭐数据结构 ⭐已更专栏有C语言、计算机网络⭐ 在学习了ArrayList之后,我们可以通过写一个洗…...
JVM: 堆上的数据存储
文章目录 一、对象在堆中的内存布局1、对象在堆中的内存布局 - 标记字段2、JOL打印内存布局 二、元数据指针 一、对象在堆中的内存布局 对象在堆中的内存布局,指的是对象在堆中存放时的各个组成部分,主要分为以下几个部分: 1、对象在堆中的…...
AI产品经理的职责与能力:将AI技术转化为实际价值
一、AI产品经理的职责 发现和解决问题:AI产品经理需要具备敏锐的洞察力,能够发现用户需求和痛点,并提出相应的解决方案。传递价值给用户:AI产品经理需要确保产品能够满足用户的需求,提供价值,并提升用户体…...
【独家原创RIME-CNN-LSSVM】基于霜冰优化算法优化卷积神经网络(CNN)结合最小二乘向量机(LSSVM)的数据回归预测
【独家原创RIME-CNN-LSSVM】基于霜冰优化算法优化卷积神经网络(CNN)结合最小二乘向量机(LSSVM)的数据回归预测 目录 【独家原创RIME-CNN-LSSVM】基于霜冰优化算法优化卷积神经网络(CNN)结合最小二乘向量机(LSSVM)的数据回归预测效果一览基本介绍程序设计参考资料 效果一览 基本…...
如何对B站的热门视频进行分析
1. 视频内容分析 主题和类型:确定视频的主题和类型(如游戏、教育、生活、科技等),分析其是否符合当前流行趋势或特定兴趣群体。内容创意:评估视频内容的创意性和原创性,是否具有吸引力和独特性。内容质量&…...
MobaXterm tmux 配置妥当
一、事出有因 缘由:接上篇文章,用Docker搭建pwn环境后,用之前学过的多窗口tmux进行调试程序,但是鼠标滚动的效果不按预期上下翻屏。全网搜索很难找到有效解决办法,最后还是找到了一篇英文文章,解决了&…...
排序算法:快速排序,golang实现
目录 前言 快速排序 代码示例 1. 算法包 2. 快速排序代码 3. 模拟程序 4. 运行程序 5. 从大到小排序 快速排序的思想 快速排序的实现逻辑 1. 选择基准值 (Pivot) 2. 分区操作 (Partition) 3. 递归排序 循环次数测试 假如 10 条数据进行排序 假如 20 条数据进行…...
step:菜单栏静态加载和动态加载
文章目录 文章介绍静态加载动态加载补充材料 文章介绍 对比静态加载和动态加载。 主界面main.qml之前使用的是动态加载,动态加载导致的问题:菜单栏选择界面切换时,之前的界面内容被清空。 修改方法:将动态加载改为静态加载 左边是…...
【简历】武汉某985大学:前端简历指导,拿offer可能性低
注:为保证用户信息安全,姓名和学校等信息已经进行同层次变更,内容部分细节也进行了部分隐藏 简历说明 这是一份985武汉某大学25届的前端简历,那么985面向的肯定是大厂的层次,但是作为前端简历,学校部分&a…...
推荐系统的核心逻辑 MVP
我们将设计一个基于内容经济的推荐系统(Minimum Viable Product, MVP)。这个系统将通过收集用户行为数据,计算用户相似度,并生成个性化的推荐结果。推荐系统将包括数据收集、数据存储、数据处理和推荐服务几个关键部分。 MVP功能…...
Java中的BIO,NIO与操作系统IO模型的区分
Java中的IO模型 Java中的BIO,NIO,AIO概念可以是针对输入输出流,文件,和网络编程等其他IO操作的。 但是主要还是在网络编程通信过程中比较重要,因为很多情况网络编程需要它们来提供更好的性能。 所以本篇文章偏向于网络…...
AI砸掉了这些人的饭碗
在一般打工人眼里,金融圈往往被认为是高端脑力工作者的聚集地,他们工资高,学历高,能力强,轻易无法被替代。 可最近,偏偏一个“非人类”的物种,要来抢他们的饭碗。相关报道称,华尔街…...
端口及对应服务
端口是计算机网络中用于区分不同服务的逻辑概念。每个端口号都是一个16位的数字,其取值范围从0到65535。端口号被分为以下几类: 公认端口(Well-known ports):范围从0到1023,这些端口通常被分配给常见的服务…...
剑指offer题解合集——Week7day1[滑动窗口的最大值]
滑动窗口的最大值 题目描述 给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。 例如,如果输入数组 [2,3,4,2,6,2,5,1] 及滑动窗口的大小 3 ,那么一共存在 6 个滑动窗口,它们的最大值分别为 [4,4,6,6,6,5] 注意&am…...
深入解读财报,开启美股投资之旅
投资股票市场,尤其是美股市场,对于许多投资者来说是一项充满挑战的活动。然而,无论投资者是倾向于技术分析还是基本面分析,财报都是他们不可或缺的工具。本文将带领读者深入了解如何通过阅读和分析财报,发现潜在的投资…...
邦芒支招:成功找到工作要掌握的3个知识点
社会进步,企业商业竞争越来越激烈,不管身为一名职场小白或是想调换一下目前的工作的人,都想找到一个称心如意的好工作。拥有以下三点知识点,可以使我们找到工作。 1、迫不得已,别做这件事 拍桌子说“我不开了”的时候有…...
Educational Codeforces Round 168 (Rated for Div. 2)-7.30复盘
A. Strong Password 简单题,找到相同的两个相邻字母之间插一个跟他们不同的大写字母即可 inline void solve(){cin>>s;int id0;char hh ;for(int i1;i<s.size();i){if(s[i-1]s[i]){idi;break;}} for(int i0;i<26;i){if(s[id]!ai&&s[id1]!ai) …...
Web开发:小结Apache Echarts官网上常用的配置项(前端可视化图表)
目录 一、须知 二、Title 三、 Legend 四、Grid 一、须知 配置项官方文档:点此进入。 我总结了比较常用的功能,写进注释里面,附带链接分享和效果图展示。(更新中....) 二、Title option {title: {text: Weekl…...
B树的平衡性与性能优化
B树的平衡性与性能优化 B树(B-tree)是一种自平衡的树数据结构,广泛应用于数据库和文件系统中,用于保持数据的有序性并允许高效的插入、删除和查找操作。B树能够很好地处理大规模数据,并在磁盘I/O操作中表现出色。本文…...
llama3源码解读之推理-infer
文章目录 前言一、整体源码解读1、完整main源码2、tokenizer加载3、llama3模型加载4、llama3测试数据文本加载5、llama3模型推理模块1、模型推理模块的数据处理2、模型推理模块的model.generate预测3、模型推理模块的预测结果处理6、多轮对话二、llama3推理数据处理1、完整数据…...
【教程】Linux安装Redis步骤记录
下载地址 Index of /releases/ Downloads - Redis 安装redis-7.4.0.tar.gz 1.下载安装包 wget https://download.redis.io/releases/redis-7.4.0.tar.gz 2.解压 tar -zxvf redis-7.4.0.tar.gz 3.进入目录 cd redis-7.4.0/ 4.编译 make 5.安装 make install PREFIX/u…...
全球汽车线控制动系统市场规模预测:未来六年CAGR为17.3%
引言: 随着汽车行业的持续发展和对安全性能需求的增加,汽车线控制动系统作为提升车辆安全性和操控性的关键组件,正逐渐受到市场的广泛关注。本文旨在通过深度分析汽车线控制动系统行业的各个维度,揭示行业发展趋势和潜在机会。 【…...
张家口做网站便宜点的/淘宝补流量平台
http://www.seowhy.com/ 转载于:https://www.cnblogs.com/releaseyou/archive/2009/05/12/1455175.html...
18末年年禁止观看网站/seo网站优化培训多少价格
地址 abs(x) 返回一个数的绝对值。实参可以是整数或浮点数。如果实参是一个复数,返回它的模。all(iterable) 如果 iterable 的所有元素为真(或迭代器为空),返回 True 。def all(iterable):for element in iterable:if not ele…...
建设部房地产网站/市场推广方案和思路
一、map函数 1、作用:它接收一个函数 f 和一个 list,并通过把函数 f 依次作用在 list 的每个元素上,得到一个新的 list 并返回。 2、实例 def f(x):return x*x a list( map (f, [1, 2, 3, 4, 5, 6, 7, 8, 9])) print (a)#[1, 4, 9, 16, 25, …...
网站如何自己做支付/设计网站都有哪些
第七章:更灵活的定位内存地址的方法05 让编程改变世界 Change the world by program 问题7.8 [codesyntax lang"asm"] assume cs:codesg,ds:datasg datasg segment db ibm db dec db dos db vax …...
wordpress ppt预览/兰州seo
1当启动类和controller在同类中时,在该类添加注解Controller即可 2当启动类和controller分开时,启动类要放在项目的根目录下,启动类中添加注解SpringBootApplication, 2当启动类和controller分开时,启动类要放在项目的…...
猪八戒上面还是淘宝上做网站技术好/三只松鼠营销案例分析
首页 所有文章 资讯 Web 架构 基础技术 书籍 教程 Java小组 工具资源 - 导航条 - 首页所有文章 资讯Web 架构基础技术 书籍教程 Java小组工具资源Integer.valueOf(String) 方法之惑 2014/02/11 | 分类: 基础技术 | 21 条评论 | 标签: 技术问答 分享到&am…...