如何制作并使用动静态库

news2024/12/27 12:54:54

制作并使用动静态库

    • 🏞️1. 动静态库概念
    • 🌁2. 如何制作动静态库
      • 📖2.1 制作静态库
      • 📖2.2 制作动态库
    • 🌠3. 如何使用动静态库
      • 📖3.1 使用静态库
      • 📖3.2 使用动态库
    • 🍁4. 动态库的加载原理

🏞️1. 动静态库概念

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

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

一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码

在可执行文件运行之前,外部函数的机器码由操作系统从磁盘上的该动态库复制到内存中,这个过程称为动态链接

动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间. 操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间.

🌁2. 如何制作动静态库

那么了解了动静态库的概念之后,如何制作动静态库呢?

📖2.1 制作静态库

现在,我们有一个.h文件和对应的.c文件,我们要将它们制作成静态库:

image-20221209102235157

image-20221209102344514

使用如下命令我们便可以将自己写的.c文件制作成.a静态库

image-20221209103145812

当我们给别人使用这个静态库时,不仅要给别人静态库文件,.h文件也需要,所以我们将.h.a文件一起打包:

image-20221209112719348

最终便可以生成静态库.

image-20221209112915285

📖2.2 制作动态库

使用如下命令生成.so文件.

image-20221209113007976

.so文件与.h文件一起打包:

image-20221209113207055

🌠3. 如何使用动静态库

📖3.1 使用静态库

为了使用静态库,我们创建一个test目录用于测试,并将我们的静态库拷贝到此目录下:

image-20221209113654695

mytest.c中,我们使用静态库中包含的方法:

image-20221209113913599

接着,当我们使用gcc编译mytest.c时,它会发生错误,提示我们找不到头文件和库文件,头文件的搜索路径:

  1. 在当前路径下查找头文件
  2. 在系统头文件路径下查找头文件

但我们的头文件和库文件都不在当前目录下,也不在系统路径中.

那么,如何解决这样的问题呢?

  1. 将头文件和库文件安装到系统路径中

    image-20221209115712792

  2. 指定头文件和库文件的搜索路径

    image-20221209120024138

📖3.2 使用动态库

使用动态库,与静态库一样,我们将我们制作的动态库与mytest.c放在test目录下:

image-20221209120704389

接着,我们使用刚才的指定搜索路径的方式来编译mytest.c

image-20221209121004774

可以看到,即便生成了mytest可执行程序,但依然运行不起来,这是因为动态库是程序运行时才链接,也就是程序已经加载进内存并成为进程才去链接,它需要运行时搜索,而对gcc指定路径只是编译时能够搜索到,运行时依然搜索不到.

如何解决呢?

  1. 将动态库拷贝到系统路径下,与静态库的方法一致,这里不再做演示.

  2. 通过导入环境变量的方式 – 程序运行时,会在环境变量中查找自己需要的动态库路径 环境变量 - LD_LIBRARY_PATH.

    export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/sss/系统编程/动静态库/mklib/lib-dyl/lib
    

    当我们导入以后再次运行:

    image-20221209122502863

  3. 修改系统的配置文件

    image-20221209124432894

    image-20221209124300686

  4. 通过软链接

    image-20221209125143027

🍁4. 动态库的加载原理

image-20221209130429223

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

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

相关文章

Mybatis-plus实战项目演示+自定义元数据对象处理器+ws

目录 一,mybatis-plus实战一 1.导入依赖 2.application.yml配置 3.实体类 4.mapper 5.service层 6.启动类上配置 二,mybatis-plus实战二 1.导入依赖 2.application.yml配置 3.实体类 2.mapper 3.service 4.分页配置 5.放一个在controller层…

jeecg-boot中实现跳过登录验证访问其他vue页面

大家好,我是雄雄,欢迎关注微信公众号,雄雄的小课堂。 前言 大家都知道,我们正常的项目,都做了访问限制,也就是,只有当用户登录本平台后,才能让用户访问别的页面,否则默认…

【Vue】Vue中mixins的使用方法及实际项目应用详解

文章目录(1)mixin基础(2)mixin特点1.选项合并2.方法和参数在各组件中不共享(3)mixin与vuex的区别(4)mixin与公共组件的区别(5)项目实践(6&#xf…

Session | 基于Session改造oa项目的登录功能

目录 一:总结域对象 二:基于Session改造oa项目的登录功能 三:oa项目的安全退出系统 一:总结域对象 (1)request(对应的类名:HttpServletRequest) 请求域(请…

【机器学习】机器学习30个笔试题

机器学习试题 在回归模型中,下列哪一项在权衡欠拟合(under-fitting)和过拟合(over-fitting)中影响最大?(A) A. 多项式阶数 B. 更新权重 w 时,使用的是矩阵求逆还是梯度下…

几款超好用的内网穿透神器,总有一款适合你!

本文以渗透的视角,总结几种个人常用的内网穿透,内网代理工具,介绍其简单原理和使用方法。 0x01 nps-npc 1.1 简介 nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。目前支持tcp、udp流量转发,可支持任何tcp、udp上层协…

前端js长整型精度丢失处理

一、现象 在分页查询时,服务端会将返回的对象进行json序列化,转换为json格式的数据,而用户的ID是一个Long类型的数据,而且是一个长度为 19 位的长整型数据, 该数据返回给前端是没有问题的。 问题实际上, …

适用于Unity的 Google Cardboard XR Plugin快速入门

本指南向您展示如何使用 Google Cardboard XR Plugin for Unity 创建您自己的虚拟现实 (VR) 体验。 您可以使用 Cardboard SDK 将移动设备变成 VR 平台。移动设备可以显示具有立体渲染的 3D 场景,跟踪头部运动并对其做出反应,并通过检测用户何时按下查看…

MySQL篇【5】——约束

目录表的约束空属性默认值列描述zerofill主键自增长唯一键外键如何理解外键约束在数据库的实际操作中难免会有一些操作不规范的地方,比方说在一张学生成绩表中,成绩的最高值为100,那么如果在这张表中如果出现了超过100分的成绩那显然是不合理…

单片机定时器

定时器 STM32有11个定时器,2个高级定时器、4个通用定时器,2个基本定时器,1个系统嘀嗒定时器(systick),2个看门狗定时器。 定时器计算: Tout((per)psc)/Tclk t(f/pre)per…

Spire.Office for Java 7.12.2 迎接新年/圣诞!!!

谷歌找破解版Spire.Office for Java is a combination of Enterprise-Level Office Java APIs offered by E-iceblue. It includes Spire.Doc for Java, Spire.XLS for Java, Spire.Presentation for Java, Spire.PDF for Java and Spire.Barcode for Java.内容及配图来自网络 …

cv2.findContours() 图像的轮廓

cv2.findContours(image, mode, method, contoursNone, hierarchyNone, offsetNone)参数: image:寻找轮廓的图像,注意输入的图片必须为二值图片。若输入的图片为彩色图片,必须先进行灰度化和二值化 mode:轮廓的检索模…

高分子PEG: mPEG-Phosphate MV 1K 2K 3.4K 5K 10K 20K 特点分享

【中文名称】甲氧基-聚乙二醇-磷酸盐 【英文名称】 mPEG-Phosphate 【结 构 式】 【CAS号】N/A 【分子式】N/A 【MV】1000、2000、3400、5000、10000、20000 【基团部分】Phosphate PEG,磷酸盐PEG 【纯度标准】95% 【包装规格】1g,5g,10g&…

java基于Springboot的影视管理系统-计算机毕业设计

项目介绍 影城管理系统的主要使用者分为管理员和用户,实现功能包括管理员:首页、个人中心、用户管理、电影类型管理、放映厅管理、电影信息管理、购票统计管理、系统管理、订单管理,用户前台:首页、电影信息、电影资讯、个人中心…

acwing-Django项目——前期工作+前端js css

文章目录1.租服务器配置环境 配置docker环境创建工作用户ljh并赋予sudo权限配置免密登录方式给server1装环境装docker将AC Terminal中的/var/lib/acwing/docker/images/docker_lesson_1_0.tar镜像上传到租好的服务器中将镜像加载到本地配置docker环境创建项目配置git运行一下dj…

C++中前置操作性能一定优于后置操作?

后置操作和前置操作,一个会产生临时变量,一个不会产生临时变量,其原因是:前置操作遵循的规则是change-then-use,而后置操作遵循的规则是use-then-change。正因为后置操作的use-then-change原则,使得编译器在…

Python如何pip批量安装指定包 - 最简单方法

文章目录背景解决办法1. 制作requirements.txt文件2. 将requirements.txt传到需要部署的电脑上3. 批量安装包背景 有很多台服务器需要配置, 简单说也就是公司给我配备了3台Windows, 我需要配置Python环境并安装7个包, 如果按照常规的pip install我至少得安装3x721次, 并且得一…

data shift--学习笔记

一般假设训练集和测试集是独立同分布的,才能保证在训练集上表现良好的模型同样适用于测试集。当训练集和测试集不同分布时,就发生了dataset shiftdata shift类型: 协变量偏移(covariate shift): 协变量&…

简约而不简单!分布式锁入门级实现主动续期-自省

一、背景 一个分布式锁应具备的功能特点中有避免死锁这一条: 如果某个客户端获得锁之后处理时间超过最大约定时间,或者持锁期间内发生了故障导致无法主动释放锁,其持有的锁也能够被其他机制正确释放,并保证后续其它客户端也能加锁…

Unity 3D 刚体(Rigidbody)|| Unity 3D 刚体实践案例

Unity 3D 中的 Rigidbody 可以为游戏对象赋予物理特性,使游戏对象在物理系统的控制下接受推力与扭力,从而实现现实世界中的物理学现象。 我们通常把在外力作用下,物体的形状和大小(尺寸)保持不变,而且内部…