【Linux】动静态库

目录

  • 1.静态库
  • 2.动态库
  • 3.静态库的使用区别
  • 总结

1.静态库

我们在linux中已经帮我们下载好了C和C++所需要的各种库,库也是文件,实际上就是各种接口的实现,我们在使用系统提供的譬如printf等函数时,就是使用系统中的库文件。使用一个库文件不仅需要对应的头文件(函数声明),还要有对应的库文件(函数实现)。
我们学过头文件展开是在预处理阶段就进行的,链接库是在链接阶段进行的。

接下来,我们通过自定义实现一个库文件,更加深入的理解如何自己实现静态库以及使用下载的各种静态库。

我们在写代码的时候需要多个文件使用,需要函数声明的文件,以及函数实现的文件,这其实跟库一个道理。
在这里插入图片描述

如何在不暴露代码的情况下让别人使用我们的接口,这实际上就是打包一个静态库,模仿linux系统。
第一步,将我们的函数实现.c文件编译成.o文件(可重定位二进制文件)
在这里插入图片描述

第二步,将所有的.o文件打一个包
使用指令: ar -rc 包名 *.o
包的名字有特定的规范 : lib + 包名 + .a
在这里插入图片描述

第三步,模仿linux系统,将包放到一个Lib的文件中,头文件放到Include文件中。
和linux类似,将头文件放到一个文件夹中,开放式的。将实现打一个包放到另一个文件夹中。

在这里插入图片描述

第四步,使用。我们自己打的包又称为第三方库,第一方是语言,第二方是OS。系统没有识别第三方库的功能,所以我们在使用的时候不仅包含头文件,还必须指定头文件所在位置以及自定义包的名字(去掉开头lib和后缀.a)。
在这里插入图片描述
此时,如果别人想使用我们实现的函数接口,我们可以将Include文件和Lib文件直接打个压缩包发给别人,别人在使用是解压缩包,即可像我们这样去使用。

小技巧:我们可以将自己的头文件放到操作系统默认搜索头文件的目录中去,将自己实现的库放到系统默认搜索库的目录中去。
在这里插入图片描述
在这里插入图片描述

2.动态库

自定义实现一个动态库。

第一步,将函数实现.c文件编译成.o文件
需要加一条指令 -fPIC 位置无关码

在这里插入图片描述

第二步,将.o文件打一个包
动态库命名规则 lib + 文件名 + .so

在这里插入图片描述

由此,我们动态库已经制作好,如何去使用呢?三种使用方法

Ⅰ 配置PATH(临时,OS每次重启会将用户自己配置的环境变量重置)
系统中有一个命名为 LD_LIBRARY_PATH的环境变量用来查找动态库的位置
我们可以将动态库所在路径配置到环境变量下。
在这里插入图片描述
在这里插入图片描述

Ⅱ 将当前自定义的动态库在系统/lib64下创建一个软连接
在这里插入图片描述

Ⅲ 配置文件
在 /etc/ld.so.conf.d/ 路径下创建一个后缀为.conf的文件,文件内容写动态库的路径
将动态库的文件位置写入创建的文件中
使用ldconfig指令将新写入的配置文件生效

在这里插入图片描述

3.静态库的使用区别

静态库的使用原理

在这里插入图片描述

动态库的使用原理

在这里插入图片描述

总结

  • 静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中。程序运行的时候将不再需要静态库
  • 动态库(.so):程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。
  • 一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码
  • 在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)
  • 动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。
  • 动态库和静态库同时存在,优先使用动态链接
  • 编译器,在链接的时候,如果提供的库既有动,又有静,优先动。只有静,只能静态链接。

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

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

相关文章

成功的海外网红营销:文化和价值观冲突的应对策略

随着全球数字化和社交媒体的崛起,海外网红营销已经成为企业推广产品和服务的一种重要方式。然而,这种全球性的营销活动也伴随着文化和价值观的多样性,容易导致潜在的冲突和误解。为了取得成功并避免不必要的争议,企业需要深入了解…

Solidity 小白教程:21. 调用其他合约

Solidity 小白教程:21. 调用其他合约 调用已部署合约 开发者写智能合约来调用其他合约,这让以太坊网络上的程序可以复用,从而建立繁荣的生态。很多web3项目依赖于调用其他合约,比如收益农场(yield farming&#xff0…

北工大汇编——综合题(2)

题目要求 编写一个比赛得分程序。共有7 个评委,按百分制打分,计分 原则是去掉一个最高分和一个最低分,求平均值。要求: 评委的打分以十进制从键盘输入。成绩以十进制给出,并保留 1位小数。输入输出时屏幕上要有相应提…

Unity WebGL 编译 报错: emcc2: error: ‘*‘ failed: [WinError 2] ϵͳ�Ҳ���ָ�����ļ���解决办法

文章目录 错误日志可能的原因及解决办法:导出路径不能有中文系统名(win)含有中文, 修改环境变量Temp和Tmp, 如下图:真正的原因: 杀毒软件删除了部分wasm相关文件,如: 错误日志 Building Library\Bee\artifacts\WebGL\build\debug_WebGL_wasm\build.js failed with output: emc…

D*算法图文详解

前面学习了Dijkstra以及A* 算法的基本原理,对于这两种算法而言,我们都能在有解的情况下找到一条沿着起点到达终点的路径。然而,这两个算法本身都是基于静态地图的,也就是说:当机器人找到路径后开始沿着起点向终点运动的…

接口测试学习

1、curl 命令 无参:curl -X POST -H"Authorization: abcdefghijklmn" https://xxx.xxxxx.com/xxxx 有参:curl -X POST -H"Authorization:abcdefghijklmn " -H"Content-Type:application/json" https://xxx.xxxxx.com/…

【Java 集合】常用的Java集合体系(134)

一、集合的体系分类 分为单列集合,双列集合。和数组相比,大小可变更加灵活。

STM32 USB CDC 虚拟串口

// 用虚拟串口(USB CDC VCP)感觉有些不稳定,尤其是下位机掉电后再上电,上位机虚拟的那个串口根本不能用,还有就是 // 必须等虚拟串口出来后且知道串口号上位机才可以执行打开操作// 上面是实际情况,但并不是STM32的USB不行&#x…

Golang 基础面试题 01

Golang 面试题合集.png 背景 在之前的文章中分享了 k8s 相关的面试题,本文我们重点来讨论和 k8s 密切相关的 Go 语言面试题。 这几年随着云原生的兴起,大部分后端开发者,特别是 Java 开发者都或多或少的想学习一些 Go 相关的技能,…

Python 基础入门

给我家憨憨写的python教程 ——雁丘 Python解释器Pycharm的安装部署 关于本专栏一 Python简介1.1 Python优点1.2 支持的编程方式1.3 版本兼容问题1.4 Python的开发环境1.4.1 常用的 Python 编辑器1.4.2 常用的 Python IDE1.4.3 Python IDLE1.4.4 第三方库安装 1.5 Python 的运…

2023年8月知识复习

物联网总括 物联网即通过网络将客观事物进行智能化互联的网络系统。互联网主要是人与人、人与计算机之间的通信,而物联网主要是物联网设备之间的通信。 注意:数据上传到云端不是物联网的必要条件。物联网可以仅在本地网络和局域网中进行通信和数据处理…

机器学习练习-决策树

机器学习练习-决策树 代码更新地址:https://github.com/fengdu78/WZU-machine-learning-course 代码修改并注释:黄海广,haiguang2000wzu.edu.cn 1.分类决策树模型是表示基于特征对实例进行分类的树形结构。决策树可以转换成一个if…

Docker的基本操作

Docker的基本操作 操作常见指令 # 推送镜像到服务 docker push # 从服务拉去镜像 docker pull # 构建镜像 docker build # 保存镜像为一个压缩包 docker save # 加载镜像 docker load镜像加载、删除等 拉取nginx docker pull nginx查看镜像 docker images # 只查看id doc…

SpringBoot2.0(mybatis-plus常见的增删改查和分页)

目录 一,mybatis-plus常见注解二,创建一个工具类和启动类三,创建实体类四,创建mapper接口五,创建service接口和impl类六,创建配置类七,创建controller八,使用测试工具测试增删改查和…

C数据结构二.练习题

一.求级数和 2.求最大子序列问题:设给定一个整数序列 ai.az..,a,(可能有负数).设计一个穷举算法,求a 的最大值。例如,对于序列 A {1,-1,1,-1,-1,1,1,1,1.1,-1,-1.1,-1,1,-1},子序列 A[5..9](1,1,1,1,1)具有最大值5 3.设有两个正整数 m 和n,编写一个算法 gcd(m,n),求它们的最大公…

在JavaScript中,什么是尾递归优化(tail call optimization)?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 尾递归优化(Tail Call Optimization)⭐ 递归和调用栈⭐ 尾递归⭐ 尾递归优化的好处⭐ JavaScript的尾递归优化支持⭐ 写在最后 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 记得点击上方或者右侧链…

Android只需要一分钟生产1到1000的dimens.xml中带命名尺寸

先上效果图&#xff1a;一分钟实现下面的效果&#xff01; 下面是教程&#xff1a; 1、使用下面的方法&#xff1a; private val listDpDimen arrayListOf<String>()private fun initDimen() {listDpDimen.clear()for (i in 1..1000) {val s "<dimen name\&qu…

微服务保护-授权规则/规则持久化

授权规则 基本规则 授权规则可以对调用方的来源做控制&#xff0c;有白名单和黑名单两种方式。 白名单&#xff1a;来源&#xff08;origin&#xff09;在白名单内的调用者允许访问 黑名单&#xff1a;来源&#xff08;origin&#xff09;在黑名单内的调用者不允许访问 点…

科技资讯|苹果虚拟纸可在Vision Pro中为广告、书籍等提供MR内容和动画

近日&#xff0c;美国专利商标局正式授予苹果一项与虚拟纸张相关的专利。这是与虚拟纸张这项发明相关的第二项专利&#xff0c;鉴于苹果 Vision Pro 将于明年上市&#xff0c;那么我们离苹果实现虚拟纸张的发明又近了一步。 虚拟纸张将能够包含 2D、3D 和动画等 MR内容&#…

python使用SMTP发送邮件

SMTP是发送邮件的协议&#xff0c;Python内置对SMTP的支持&#xff0c;可以发送纯文本邮件、HTML邮件以及带附件的邮件。 Python对SMTP支持有smtplib和email两个模块&#xff0c;email负责构造邮件&#xff0c;smtplib负责发送邮件。 首先&#xff0c;我们来构造一个最简单的…