【Linux】动静态库

认识动静态库

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

库的本质:一堆.o文件的集合。

库的名称:以libc.so为例,去掉前缀lib 去掉后缀.so ,留下的就是库的名称

生成静态库

将add.c、sub.c生成add.o和sub.o,然后进行打包生成静态库

将头文件和生成的静态库分别放在mylib目录下的include目录和lib目录下

生成静态库的语法格式

ar -rc 生成的静态库名称,想要打包的.o文件

上述过程在makefile文件中操作:

模拟使用静态库:

.h文件就是库中函数的声明相当于告诉使用者库中都有什么接口,.o文件中有这些函数的实现,所以对于使用者来说使用第三方库时包含第三方库的头文件和指明库即可。这里模拟实现使用者下载并使用第三方库是将当前路径下的库文件复制到上级目录实现的。

使用静态库并生成可执行程序:

其中-I后面跟的是头文件所在的路径,-L后面跟的是静态库所在的路径,-l后面跟的是静态库的名称

静态库链接的过程:

生成动态库

动态库的生成方法:一是在生成.o文件时需要加上fPIC生成位置无关码。二是在打包时候使用gcc命令,加上shared,表示生成共享库格式。

手动打包.h文件和.so文件复制到上级目录,模拟动态库的发布与下载。

尝试使用动态库编译并运行程序:

编译没有问题但是运行时报错:找不到动态库。原因是编译时我们告诉了gcc编译器在哪里链接动态库和要连接的动态库的名称,但是运行可执行文件是操作系统将该文件加载到内存中变成一个进程,动态库是动态链接的,在程序运行时才去链接动态库,但是并没有告诉操作系统动态库在哪里所以报错。

解决方法

1.将第三方库的头文件放到系统的头文件路径下,将第三方库放到系统库的路径下,但是在使用库时还是要指明库的名称

cp mylib/include/*.h /usr/include/
cp mylib/lib/*.so /lib/

2.在环境变量中添加第三方库

$LD_LIBRARY_PATH //OS在动态链接的时候会在这个环境变量下寻找动态库的路径,然后找到动库
echo $LD_LIBRARY_PATH //查看当前环境变量中存储的动态库的路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/kk/mylib/lib

添加到环境变量中的第三方库的路径只在本次登录虚拟机期间有效,下次登录使用时还得重新添加。

3.在配置文件中设置

/etc/ld.so.conf.d/ OS在链接动态库时会这个路径下的配置文件中查找第三方库的路径
添加配置文件的步骤:
1.cd /etc/ld.so.conf.d
2.touch kuname.conf
3.vim kuname.conf
4.将动态库的路径写入该文件
5.ldconfing //相当于刷新一下当前路径下的所有配置文件

动态库的加载:

可执行程序使用到动态库中的实现方法,在可执行程序中记录了该实现方法在库中的偏移量,在运行时OS将动态库加载到内存,通过页表映射到虚拟内存中的共享区,此时库就有了地址,偏移量根据库的地址就能计算出要使用的函数等实现方法的地址,就可以找到所需要的方法。偏移量是在生成动态库时使用用的-fPIC生成的与位置无关码。动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。操作系统采用虚拟内存机制允许物理内存中的一份动态库被要用到该库的所有进程共用,节省了内存和磁盘空间。

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

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

相关文章

MySQL注入秘籍【绕过篇】

MySQL注入秘籍【绕过篇】1.通用方法2.绕过空格3.绕过引号4.绕过逗号,5.绕过等号6.绕过and/or7.绕过注释符8.绕过函数检测1.通用方法 编码 编码无非就是hex、url等等编码,让传到数据库的数据能够解析的即可,比如URL编码一般在传给业务的时候就会自动解码…

【沐风老师】3DMAX交通流插件TrafficFlow使用方法详解

TrafficFlow交通流插件,模拟生成车流、人流动画。 【版本要求】 3dMax 2008及更高版本 【安装方法】 无需安装直接拖动插件脚本文件到3dMax视口中打开。 【快速开始】 1.创建车辆对象和行车路径。 2.打开TrafficFlow插件,先选择“车辆”对象&#xff0…

大数据处理学习笔记2.1 初识Spark

文章目录零、本节学习目标一、Spark的概述(一)Spark的组件1、Spark Core2、Spark SQL3、Spark Streaming4、MLlib5、Graph X6、独立调度器、Yarn、Mesos(二)Spark的发展史1、发展简史2、目前最新版本二、Spark的特点(一…

对void的深度理解

作者:小树苗渴望变成参天大树 作者宣言:认真写好每一篇博客 作者gitee:gitee 如 果 你 喜 欢 作 者 的 文 章 ,就 给 作 者 点 点 关 注 吧! void前言一、 void 关键字二、 void修饰函数返回值和参数三、void指针3.1void * 定义的…

BeanPostProcessor原理分析

文章目录一、BeanPostProcessor的作用1. 源码2. 使用案例二、Spring生命周期中的BeanPostProcessor三、BeanPostProcessor对PostConstruct的支持四、BeanPostProcessor中的顺序性五、总结一、BeanPostProcessor的作用 BeanPostProcessor提供了初始化前后回调的方法,…

百度文心一言正式亮相

OpenAI 刚发布了 GPT-4,百度预热已久的人工智能生成式对话产品也终于亮相了。昨天下午,文心一言 (ERNIE Bot)—— 百度全新一代知识增强大语言模型、文心大模型家族的新成员,正式在百度总部 “挥手点江山” 会议室里发布。 发布会一开场&…

Linux第一个小程序git三板斧

目录 1.Linux项目自动化构建工具 - make/makefile 1.1.makefile原理 1.2.项目清理 2.第一个小程序 - 进度条 3.git三板斧 1.Linux项目自动化构建工具 - make/makefile make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。 …

HashData携手新炬网络 共推国产云数仓产业发展

3月22日,酷克数据宣布与国内知名IT智能运维服务商新炬网络签署战略合作协议,新炬网络成为酷克数据核心战略合作伙伴。 双方约定,将通过优势互补、资源共享的方式,建立长期合作模式和信息共享机制,在数据库相关领域展开…

Prometheus监控实战之Blackbox_exporter黑盒监测

1 Blackbox_exporter应用场景 blackbox_exporter是Prometheus官方提供的exporter之一,可以提供HTTP、HTTPS、DNS、TCP以及ICMP的方式对网络进行探测。 1.1 HTTP 测试 定义 Request Header信息 判断 Http status / Http Respones Header / Http Body内容 1.2 TC…

第二十二章 opengl之高级OpenGL(几何着色器)

OpenGL使用几何着色器用点造物体爆破物体法向量可视化在顶点和片段着色器之间有一个可选的几何着色器(Geometry Shader), 几何着色器的输入是一个图元(如点或三角形)的一组顶点。几何着色器可以在顶点发送到下一着色器阶段之前对它们随意变换…

基于YOLOv5的疲劳驾驶检测系统(Python+清新界面+数据集)

摘要:基于YOLOv5的疲劳驾驶检测系统使用深度学习技术检测常见驾驶图片、视频和实时视频中的疲劳行为,识别其闭眼、打哈欠等结果并记录和保存,以防止交通事故发生。本文详细介绍疲劳驾驶检测系统实现原理的同时,给出Python的实现代…

第十四届蓝桥杯三月真题刷题训练——第 19 天

第 1 题:灌溉_BFS板子题 题目描述 小蓝负责花园的灌溉工作。 花园可以看成一个 n 行 m 列的方格图形。中间有一部分位置上安装有出水管。 小蓝可以控制一个按钮同时打开所有的出水管,打开时,有出水管的位置可以被认为已经灌溉好。 每经过一分…

一文带你看懂电压放大器和功率放大器的区别

很多人对于电压放大器和功率放大器总是分不太清,在实际应用过程中,电压放大器和功率放大器所起到的作用都是相同的。对于功率放大器和电压放大器的区别,今天就让安泰电子来带我们一起看看。功率放大器和电压放大器的主要区别是:功…

花青染料Sulfo-Cyanine7 N3,Cy7 azide,Sulfo-Cy7 N3,用于点击化学的水溶NIR azide染料

●中文名:磺化花青素Cyanine7叠氮,磺化花青素Cy7叠氮●英文名:Sulfo-Cyanine7 azide,Sulfo-Cyanine7 N3,Sulfo-Cy7 azide,Sulfo-Cyanine7 N3【产品理化指标】:CAS号:N/A分子式&#…

应用层协议 HTTP HTTPS

目录 应用层 再谈 "协议" 序列化和反序列化 关于 json库 request序列化 request反序列化 response序列化 response反序列化 PS:命令宏 HTTP协议 认识URL urlencode和urldecode HTTP协议格式 HTTP请求 HTTP响应 请求方法 ​编辑 HT…

自动化测试学习(七)-正则表达式,你真的会用吗?

目录 一、正则表达式在python中如何使用 二、用正则表达式匹配更多模式 三、常用字符分类的缩写代码 总结 所谓正则表达式(regex),就是一种模式匹配,学会用正则匹配,就可以达到事半功倍的效果。 一、正则表达式在…

幸福的烦恼:显卡算力太高而pytorch版本太低不支持

NVIDIA GeForce RTX 3090 with CUDA capability sm_86 is not compatible with the current PyTorch installation. The current PyTorch install supports CUDA capabilities sm_37 sm_50 sm_60 sm_70.写在最前面项目场景:问题描述原因分析:解决方案&am…

Linux(网络基础---数据链接层)

文章目录0. 前言1. 以太网的帧格式2. 再谈局域网原理3. 汇总整体通信流程,补全细节3-1 理解MAC地址和IP地址3-2 MTU1. 认识MTU2. MTU对IP协议的影响3. MTU对UDP协议的影响4. MTU对于TCP协议的影响3-3 ARP协议1. 基本概念2. ARP协议的作用3. ARP数据报的格式4. 简述a…

ChatGPT能够改变时代吗?一点点思考

都知道ChatGPT的出现对整个世界产生了剧烈的影响,前不久出的ChatGPT4更是在ChatGPT3.5的基础上展现了更强的功能。比如说同一个问题,ChatGPT3.5还是乱答的,ChatGPT4已经能给出正确解了。当然这只能说明技术是进步的。 虽然如此,很…

图像识别模型

一、数据准备 首先要做一些数据准备方面的工作:一是把数据集切分为训练集和验证集, 二是转换为tfrecord 格式。在data_prepare/文件夹中提供了会用到的数据集和代码。首先要将自己的数据集切分为训练集和验证集,训练集用于训练模型…
最新文章