【Linux】动态库和静态库

动态库和静态库

      • 软链接
      • 硬链接
        • 硬链接要注意
      • 自定义实现一个静态库(.a)
        • 解决、使用方法
        • 静态库的内部加载过程
      • 自定义实现一个动态库(.so)
        • 动态库加载过程
      • 静态库和动态库的特点

软链接

命令:ln -s 源文件名 目标文件名
软链接是独立连接文件的,他有自己的inode number,有自己的inode属性和内容。
软链接内部存放的是自己所指向文件的路径。
现实中,我们软链接的应用有,例如电脑桌面的快捷模式等。
在这里插入图片描述
inode number 不相同

硬链接

命令:ln 源文件目标文件
硬链接,通过inode来重新链接一份文件,此文件的inode跟原文件的inode是一样的,可以理解为原文件的浅拷贝,两个文件内容是共享的,不管增加还是删除,这是因为他们的inode是相同的
在这里插入图片描述
inode相等
在这里插入图片描述

硬链接要注意

硬链接是不可以给目录做硬链接的,这是因为当用户进行对目录硬链接时,容易造成环路问题,os无法识别那个是自己定义的硬链接。

了解目录隐藏文件. ..
在这里插入图片描述

自定义实现一个静态库(.a)

  1. 系统已经预装了c/c++的头文件和库文件,头文件提供方法说明,库提供方法的实现,头和库是有对应关系的,是要组合在一起使用的。
  2. 头文件是在预处理阶段就引入的,链接本质就是链接库

方法一:头文件和.o文件在一块可直接应用
在这里插入图片描述

形成静态库文件
命令:ar -rc lib库名.a *.o
在这里插入图片描述

方法二:我们将库和头文件都带入到另一个文件进行重新编译运行
在这里插入图片描述
当我们使用时发现不可以正常使用
在这里插入图片描述
这是因为我们引入了第三方的库,编译器目前不认可这个库,需要我们手动

解决、使用方法

第三方库的使用错误解决方法:

  1. 需要指定所用的头文件和库文件
  2. 如果没有安装到对应的编译器路径下,用户必须指明对应的选项,告知编译器,头文件在哪里,库文件在哪里,库文件具体是谁。
  3. 将三方库拷贝到编译器路径下时,我们进行编译时,也需要使用-l指定具体使用的库

l:只要库名即可(去掉lib以及版本号)
L:链接库所在的路径
I:链接库的头文件所在路劲
在这里插入图片描述

方法三:头文件放到include目录下,库文件放到lib目录下,将两个目录打包交给别人
在这里插入图片描述

静态库的内部加载过程

静态库不需要加载,静态库是将代码直接拷贝到程序中,因此内存中的代码和数据可能会存在多分,造成空间浪费。把静态库代码拷贝到内存中的代码区。
当我们将静态库加载过一次之后,在删除静态库后还是可以正常跑的 在这里插入图片描述

自定义实现一个动态库(.so)

形成动态库文件

  • shared: 表示生成共享库格式
  • fPIC:产生位置无关码
    动态库采用的是相对位置编址。只保存相对函数之间的偏量值(库起始地址+函数之间偏移量)
    而静态库采用的为绝对地址,如果我们库位置有所变动,他就需要重新拷贝
    在这里插入图片描述

在这里插入图片描述

与静态库使用发放三方式相同,但是需要注意的方面不一样

头文件放到include目录下,库文件放到lib目录下,将两个目录打包交给别人
在这里插入图片描述
在这里插入图片描述

为什么静态库就可以找到而动态库就不可以呢?
这是因为静态库的链接原则是将用户使用的二进制代码直接拷贝到目标可执行程序中但是动态库不会。

如何解决os找不到动态库问题?

  1. 配置环境变LD_LIBRARY_PATH(临时方案,当系统重启后需要重新配置)
    在这里插入图片描述
    在这里插入图片描述
  1. 软连接方案
    在这里插入图片描述
    去掉软连接方法
    sudo unlink /lib64/libmy_math.so
  1. 配置文件方法
    ls /etc/ld.so.conf.d查看本地的路径配置文件
    sudo touch /etc/ld.so.conf.d/myPath.conf添加创建本地路径配置文件
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    系统重新启动也是可以直接使用的,因为我们已经把环境配置好了

动态库加载过程

动态库通过fPIC形成位置无关码,采用相对编址的方式,在程序链接时将对应库中的偏移量添加到程序中,库函数在程序运行时加载进来,经过页表,把库映射到虚拟地址空间后(共享区),库就具有了起始地址。通过起始地址和偏移地址,就可以找到要调用的库函数。
在这里插入图片描述
系统层面上会维护动态库的起始地址(虽然刚刚加载时不能确定起始地址,因为共享区是由OS分配的,但是加载完毕就不会改变了),直接建立页表与内存的映射,就可以直接跳转访问了。所以动态库加载一次就可以被多个进程共同使用。
动态库相对于静态库更节省内存,静态库由多个程序使用相同的库函数,加载到内存中就会导致内存中有多份重复的库函数代码,而动态库则是多个程序共用一份动态库,不会导致出现重复的库函数代码,就节省了内存空间。

静态库和动态库的特点

静态库的特点:

  • 静态库在可执行程序链接时就加入到可执行代码中,在物理上成为可执行程序的一部分;程序运行时将不在需要该静态库。
  • 相对于动态库链接生成的程序,静态还相当于编译器将代码补充完整了,因此执行程序会大一些,但是运行起来相对快一些。
  • 静态库是牺牲了空间效率,换取了时间效率
    动态库特点:
  • 动态库在程序编译时并不会被链接到目标程序中,而是在程序运行时才被载入,因此在程序运行时还需要动态库的存在。
    动态库只要在程序执行时,那些需要的函数代码才被拷贝到内存中。这样就使可执行文件比教小,节省磁盘空间。
  • 由于运行时要去链接库会花费一定的时间,执行速度可能会相对慢一些。
    动态库是牺牲了时间效率,换取了空间效率。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Winform学习笔记(八)】通过委托实现跨窗体传值

通过委托实现跨窗体传值 前言正文1、委托及事件2、通过委托实现跨窗体传值的步骤1.在子窗体中定义委托2.在子窗体中声明一个委托类型的事件3.调用委托类型事件4.在实例化子窗体后,子窗体订阅事件接受方法5.实现具体的事件 3、具体示例4、完整代码5、实现效果 前言 …

论文阅读_条件控制_ControlNet

name_en: Adding Conditional Control to Text-to-Image Diffusion Models name_ch: 向文本到图像的扩散模型添加条件控制 paper_addr: http://arxiv.org/abs/2302.05543 date_read: 2023-08-17 date_publish: 2023-02-10 tags: [‘图形图像’,‘大模型’,‘多模态’] author: …

解决政务审计大数据传输难题!镭速传输为政务行业提供解决方案

政务行业是国家治理的重要组成部分,涉及到国家安全、社会稳定、民生福祉等方面。随着信息技术的快速发展和革新,政务信息化也迎来了新一轮的升级浪潮。国家相继出台了《国家信息化发展战略纲要》《“十三五”国家信息化规划》《“十四五”推进国家政务信…

华为OD机试 - 最佳植树距离 - 二分查找(Java 2023 B卷 100分)

目录 一、题目描述二、输入描述三、输出描述四、备注说明五、二分查找六、解题思路七、Java算法源码八、效果展示1、输入2、输出3、说明 一、题目描述 按照环保公司要求,小明需要在沙化严重的地区进行植树防沙工作,初步目标是种植一条直线的树带。 由于…

算法笔记(一):时间复杂度

省略的技巧 已知 f ( n ) f(n) f(n) 来说,求 g ( n ) g(n) g(n) 表达式中相乘的常量,可以省略,如 f ( n ) 100 ∗ n 2 f(n) 100*n^2 f(n)100∗n2 中的 100 100 100 多项式中数量规模更小(低次项)的表达式&#…

基于JSP+Servlet+mysql养老院管理系统

基于JSPServletmysql养老院管理系统 一、系统介绍二、功能展示四、其他系统实现五、获取源码 一、系统介绍 项目类型:Java web项目 项目名称:基于JSPServlet的养老院管理系统 [yanglaoyuan] 当前版本:V1.0.0版本 难度等级:✩✩点…

使用Dockker创建vwas容器时报错的解决方法

执行命令 docker run -it -d -p 13443:3443 --cap-add LINUX_IMMUTABLE secfa/docker-awvs没有详细看报错之前找了各种各样的解决办法,都无法解决。因此以后在看报错提示的时候耐心一点看关键词Error 后来才发现启动vwas时docker报了这个错: OSError: …

人力资源小程序的设计与开发步骤

在当前信息化时代,小程序成为了各行各业提升用户体验和服务效率的重要渠道。人力资源部门也可以通过定制开发人力资源小程序来提升招聘、培训、员工福利等方面的工作效率。接下来,我们将介绍人力资源小程序定制系统开发的具体流程。 首先,我们…

Facebook HiPlot “让理解高维数据变得容易”

在这个全球信息化的时代,数据量呈爆炸式增长,数据的复杂性也是如此。如何有效地处理高维数据并找到隐藏在其中的相关性和模式是一个严峻的挑战。近年来,可视化和可视化分析已被应用于该任务,并取得了一些积极成果。Facebook的新Hi…

1782. 统计点对的数目

给你一个无向图,无向图由整数 n ,表示图中节点的数目,和 edges 组成,其中 edges[i] [ui, vi] 表示 ui 和 vi 之间有一条无向边。同时给你一个代表查询的整数数组 queries 。 第 j 个查询的答案是满足如下条件的点对 (a, b) 的数…

Agile Iteration Velocity

【agile iteration velocity】敏捷速度指的平均速度 第四次迭代结束速度: 76 / 4 19 第五次迭代结束速度: (76 24 ) / 5 100 / 5 20

Qt 自定义提示框 右下角冒泡

网页右下角上经常会出现一些提示性的信息,B/S有的东西,C/S当然也可以有,就像QQ的消息提示一样! 实现一个类似的东西并不困难,只要想明白原理实现起来就很简单了! 实现原理: (1&#…

20230822 Windows上使用find_package引入OpenCV报错

报错信息 打开Cmake项目时,find_package 报错: Found OpenCV Windows Pack but it has no binaries compatible with yourconfiguration.You should manually point CMake variable OpenCV_DIR to your build of OpenCVlibrary.原因 大概率原项目是在 …

Systick滴答定时器

今天,对Systick滴答定时器进行资料的整理,这个定时器在程序中的作用就是提供延时函数。参考(【STM32】Systick滴答定时器_一只大喵咪1201的博客-CSDN博客) Systick滴答定时器的介绍 相关寄存器 寄存器CTRL 补充HCLK 寄存器LOAD…

Python项目开发案例————学生信息管理系统(附源码)

一、学生信息管理系统 本文使用Python语言开发了一个学生信息管理系统,该系统可以帮助教师快速录入学生的信息,并且对学生的信息进行基本的增、删、改、查操作;还可以实时地将学生的信息保存到磁盘文件中。 1.1 需求分析 为了顺应互联网时代…

2023年高教社杯数学建模思路 - 复盘:校园消费行为分析

文章目录 0 赛题思路1 赛题背景2 分析目标3 数据说明4 数据预处理5 数据分析5.1 食堂就餐行为分析5.2 学生消费行为分析 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 赛题背景 校园一卡通是集…

[蓝帽杯 2022 初赛]domainhacker

打开流量包,追踪TCP流,看到一串url编码 放到瑞士军刀里面解密 最下面这一串会觉得像base64编码 删掉前面两个字符就可以base64解码 依次类推,提取到第13个流,得到一串编码其中里面有密码 导出http对象 发现最后有个1.rar文件 不出…

FANUC机器人加减速倍率指令ACC的使用方法说明

FANUC机器人加减速倍率指令ACC的使用方法说明 单位有一台FANUC机器人(型号:M-900iB 360kg),偶尔会在启动的瞬间会报SRVO-050碰撞检测报警,而事实上机器人并没有开始移动或和其他工件产生碰撞,一直查了很长时间,也没有查到具体的原因,也尝试过重新进行负载推算,但是偶尔…

macOS M1使用TensorFlow GPU加速

本人是在pycharm运行代码,安装了tensorflow版本2.13.0 先运行代码查看有没有使用GPU加速: import tensorflow as tf# Press the green button in the gutter to run the script. if __name__ __main__:physical_devices tf.config.list_physical_dev…

Electron 报gpu_process_host.cc(951)] GPU process launch faile错误

解决方法,在入口js文件中,添加如下代码: app.commandLine.appendSwitch(no-sandbox)