【linux】详解——库
目录
概述
库
库函数
静态库
动态库
制作动静态库
使用动静态库
如何让系统默认找到第三方库
lib和lib64的区别
/和/usr/和/usr/local下lib和lib64的区别
环境变量
配置相关文件
个人主页:东洛的克莱斯韦克-CSDN博客
简介:C站最萌博主
相关文章:【linux】认识“文件”的本质,理解“文件系统”的设计逻辑,体会linux优雅的设计理念-CSDN博客
【linux】进程控制——进程创建,进程退出,进程等待-CSDN博客
【linux】如何优雅的使用vim编辑器-CSDN博客

概述
系统调用
内核对外提供接口。用户进程不能直接访问内核数据并对其操作,只能通过这些接口访问,进程调用这些接口的行为叫做系统调用
访问内核
系统调用 shell外壳 库函数

库
库函数
系统调用的功能是很纯粹的。库函数是把系统调用进行了封装,让功能更丰富。
以C库中的printf()为例。printf底层封装的是write,write接口的功能是把数据刷到内核缓冲区,而printf会在内核缓冲区之前封装一层用户级缓冲区,以提高printf函数的效率。
库会为我们提供丰富的库函数来满足我们对编程的需求。人们常说的站在巨人的肩膀上其实就是把别人写好的成熟的库拿来用。
静态库
命名格式为:lib____.a 前缀为lib,后缀为.a。 中间部分为库名。
动态库
命名格式为:lib____.so 前缀为lib,后缀为.so。 中间部分为库名。
对于动态库的链接,可以理解为是把库方法的地址给给目标文件
如果一个进程需要动态库,动态库就要被加载到内存。如果多个进程共同使用一个动态库,这个动态库也可以称为共享库
制作动静态库
制作静态库
1.把可执行程序编译成.o文件,也就是二进制文件
2.将这些二进制文件用ar工具打包,就形成静态库啦
示例
ar -rc libmymath.a add.o sub.o
gcc -fPIC -c sub.c add.cgcc -shared -o libmymath.so *.o 我们用如下几个文件制作动态库和静态库
静态库文件
static.c
#include"static.h" 2 3 void Print()4 {5 printf("hello linux\n");6 printf("hello linux\n");7 printf("hello linux\n");8 printf("hello linux\n");9 printf("hello linux\n");10 printf("hello linux\n");11 12 return ;13 14 }
static.h
#include<stdio.h> void Print();
动态库文件
dynamic.c
#include"dynamic.h"2 3 void Prinr_d()4 {5 6 printf("hi linux\n");7 printf("hi linux\n");8 printf("hi linux\n");9 printf("hi linux\n");10 printf("hi linux\n");11 12 return ; }
dynamic.h
1 #include<stdio.h>2 3 void Print_d();
编写make脚本
1 s_lib = libmystatic.a2 d_lib = libmydynamic.so3 4 #伪目标5 .PHONY:all6 all:$(s_lib) $(d_lib)7 8 #静态库9 $(s_lib):static.o10 @ar -rc $@ $^11 static.o:static.c12 @gcc -c $^13 14 #动态库15 $(d_lib):dynamic.o16 @gcc -shared -o $@ $^17 dynamic.o:dynamic.c18 @gcc -fPIC -c $^19 20 #清理21 .PHONY:clean22 clean: 23 @rm -rf *.o *.a *.so mylib 24 25 #发布26 .PHONY:ph27 ph:
28 @mkdir -p mylib/lib29 @mkdir mylib/include30 @cp *.a *.so mylib/lib31 @cp *.h mylib/include
~
将库发布出来:把动静态库和相关头文件打包到一个目录里

查看mylib目录结构

使用动静态库
我们自己制作的库属于第三方库,需要在gcc中添加相关选项
I (大写i):表示头文件路径
L:表示库路径
l (小写L):表示链接哪个库
静态库测试代码如下 s_test.c
1 #include"static.h"2 3 int main()4 {5 Print(); 6 7 return 0;8 }
用gcc编译

动态库测试代码如下d_test.c
1 #include"dynamic.h"2 3 int main()4 {5 6 Prinr_d(); 7 8 return 0;9 }
用gcc编译

那么动态链接第三方库的可执行程序能运行吗

显然是不能。
进程需要动态库的方法实现,动态库就必须加载到内存。但上述指令中,我们只告诉了gcc相应的库在哪里。
系统并不能找到相应的库。
而且上述gcc编译时,需要带一堆路径。根本原因是系统找不到第三方库。
如何让系统默认找到第三方库
系统会去默认路径下找相关的库(静态库和动态库)
/lib 和/lib64
/usr/lib 和 /usr/lib64
/usr/local/lib和/usr/local/lib64
系统会去默认路径下找相关的头文件
/usr/include
lib和lib64的区别
ilb是32位程序运行的库
lib64是64位程序运行的库
/和/usr/和/usr/local下lib和lib64的区别
/lib和/lib64 是 /usr/lib和 /usr/lib64 的软连接,也就是说根目录下的是快捷方式
在根目录下用 ll 指令查看

/usr/local/lib和/usr/local/lib64和上述两个库目录的区别呢
/usr下面的lib和lib64一般存放的是系统安装的标准库文件,和共享库文件,是系统管理安装的。
/usr/local下面的lib和lib64是由系统的管理员或者我们去手动安装的。
知道了系统默认搜索路径,由如下两个方法就可以让系统找到第三方库
1.直接把库拷贝到系统的默认搜索路径下
2.在系统默认搜索路径下建立软连接
ln -s 要查找的路径 软连接的文件放哪
环境变量
LIBRARY_PATH是一个环境变量,它用于指定程序在寻找共享库(动态链接库,.so文件)时应搜索的路径列表。
当编译或运行一个动态链接的程序时,如果程序依赖的库不在当前目录或系统默认的搜索路径中,LIBRARY_PATH会帮助系统查找这些库。
LD_LIBRARY_PATH 是一个重要的环境变量,它告诉动态链接器在哪里查找共享库。
当你在命令行中运行一个程序时,如果它依赖于某些共享库,并且这些库不在标准库路(如 /lib、/usr/lib 等)中, LD_LIBRARY_PATH 会帮助系统查找这些库。
临时设置
export LD_LIBRARY_PATH=/path/to/libs:$LD_LIBRARY_PATH
将新的路径添加到 $LD_LIBRARY_PATH 的前面,并用冒号(:)分隔,可以确保新的路径在标准库路径之前被搜索
永久设置
对于某个用户,可以将 export 命令添加到 /.bashrc、/.bash_profile 或 /.profile 文件中
对于所有用户,可以将 export 命令添加到 /etc/profile 或 /etc/environment 文件中
配置相关文件
让系统找到相关的动态库可以在/etc/ld.so.conf.d/目录下建立以.conf为后缀的文件。在这个文件中写入动态库的路径即可。
然后执行ldconfig指令更新
相关文章:
【linux】详解——库
目录 概述 库 库函数 静态库 动态库 制作动静态库 使用动静态库 如何让系统默认找到第三方库 lib和lib64的区别 /和/usr/和/usr/local下lib和lib64的区别 环境变量 配置相关文件 个人主页:东洛的克莱斯韦克-CSDN博客 简介:C站最萌博主 相关…...
RuntimeError: “exp_vml_cpu“ not implemented for ‘Half‘
遇到 "exp_vml_cpu" not implemented for Half 这个运行时错误,意味着你尝试在一个操作中使用了半精度(Half 或 float16)数据类型,但是该操作在当前环境下并没有针对半精度数据类型的实现。 半精度(float16&…...
JVM之双亲委派机制
1.双亲委派机制 在Java中,类加载器具有层次结构。每个Java实现的类加载器中保存了一个成员变量叫“父”类加载器(parent),可以理解为上级,并不是继承关系。应用程序类加载器的parent父加载器是扩展类加载器࿰…...
Gemalto SafeNet Luna HSM服务器硬件监控指标解读
在现代化的信息安全体系中,硬件安全模块(HSM)扮演着至关重要的角色,它负责保护和管理敏感的数据和密钥。Gemalto SafeNet Luna HSM作为一款高性能的硬件安全模块,广泛应用于金融、政府和企业等领域。为了确保Luna HSM的…...
计算机视觉与人工智能领域常用期刊和会议缩写
在撰写论文时有时候会面临超篇幅的情况,这时候一个常用的操作便是使用期刊(会议)的缩写或者半缩写来替换期刊(会议)全称 为了方便自己后续使用相关的缩写 特此整理 如有不当之处 欢迎大家指正~~ 计算机视觉与人工智能…...
ONLYOFFICE桌面编辑器8.1版:个性化编辑和功能强化的全面升级
ONLYOFFICE是一款全面的办公套件,由Ascensio System SIA开发。该软件提供了一系列与微软Office系列产品相似的办公工具,包括处理文档(ONLYOFFICE Document Editor)、电子表格(ONLYOFFICE Spreadsheet Editor࿰…...
用一个实例看如何分享大量照片 续篇二,关于Exif (Exchangeable Image File) - 可交换图像文件
续篇二:说说关于照片隐含的 Exif (Exchangeable Image File) 可交换图像文件 数码照片的Exif 参数有很多,重要的Exif信息:拍摄日期、时间、拍摄器材、GPS信息。 当然这主要对自己的档案有意义,如果放到网上还是建议抹去这些信息。…...
使用Python自动化收集和处理视频资源的教程
在这篇教程中,我们将介绍如何利用Python脚本自动化收集和处理视频资源。这篇文章将帮助您掌握基本的网络自动化技术,并使用相关库进行视频资源的获取和保存。以下是具体的实现步骤和代码示例。 环境准备 在开始之前,请确保您的工作环境中已…...
字节数组输出流转换为Base64方法记录
1. 今天在做字节数组转换Base64的时候遇到一个问题,转换成的Base64字符串自动换行,导致传输失败 关键代码: ByteArrayOutputStream out new ByteArrayOutputStream(); ............. BASE64Encoder encoder new BASE64Encoder(); Stri…...
在eclipse中导入idea项目步骤
一、可以把其它项目的.project, .classpath文件拷贝过来,修改相应的地方则可。 1、.project文件只需要修改<name>xxx</name>这个项目名称则可 2、.classpath文件通常不用改, 二、右击 项目名 >选择“Properties”>选择 Re…...
海思SS928/SD3403开发笔记4——u盘挂载
首先一定要将u盘格式化成fat32。 挂载 mkdir /mnt/usb mount /dev/sda1 /mnt/usb成功示意图: 取消挂载 umount /mnt/usb...
偏微分方程算法之抛物型方程差分格式编程示例六(混合边界条件下C-N格式)
目录 一、研究问题 二、C++代码 三、计算结果 一、研究问题 对于混合边界条件下的抛物型偏微分方程求解,我们使用Crank-Nicolson格式(C-N格式),边界条件采用中心差商,即...
【5G核心网】5G NWDAF(Network Data Analytics Function)网元功能介绍
博主未授权任何人或组织机构转载博主任何原创文章,感谢各位对原创的支持! 博主链接 本人就职于国际知名终端厂商,负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作,目前牵头6G技术研究。 博客内容主要围绕…...
今日思考分享:全网爆火的山东车牌之歌原因是什么?
山东车牌之歌的爆火反映了一种潜在而又浅显的需求被满足的过程。 首先,这首歌击中了人们的“潜”需求。在日常出行中,我们确实会偶尔对看到的不同地区车牌产生好奇,但往往这种好奇心一闪而过,没有具体的途径去满足。而山东车牌之歌…...
Spring Boot 2.x + Mybatis Plus 多数据源配置
MP官方文档提供有多数据源配置方案,这里没有使用其方案,原因是项目不想引入过多依赖 提供一下官网的文档供各位选择多数据源支持 | MyBatis-Plus (baomidou.com) 配置文件 application.properties文件配置两个数据源信息,yaml文件自行修改…...
2、数据库模型图、er图
关系 user和administarators是多对一的关系 user和order是一对多的关系 shipped和order是多对一的关系 order和books是多对多的关系 leavewords和order是一对一的关系 stock和books是一对多的关系 Chens 数据库表示法——ER图 Crows Foot数据库表示法——数据库模型图 Navicat表…...
Docker的理解
Docker的理解 Docker为什么用Docker?1.提升系统资源利用率2.更快速的交付和部署3.高效的部署和扩容4.更简单的管理 Docker核心技术Docker镜像Docker容器Docker仓库 Docker实现原理Linux NamespaceCgroupUnion FS Docker的应用场景1.微服务架构2.持续集成3.快速部署和…...
通信协议总结
IIC 基本特点 同步,半双工 标准100KHz,最高400KHz(IIC主要应用于低速设备) 硬件组成 需外接上拉电阻 通信过程 空闲状态 SDA和SCL都处于高电平 开始信号S和终止信号P 在数据传输过程中,当SCL0时,SDA才…...
Pinia + 组合式写法 + 选项式写法
选项式: 1.定义Store import { defineStore } from pinia// option api 选项式 export const useAlterStore defineStore(alter, {state: () > {return {num: 1}},getters: { // 可以看做是计算属性doubleCount: (state) > state.num * 2},actions: {// 同…...
vCenter-vAPI-Endpoint service health shows as Yellow
- 问题摘要:vAPI-Endpoint service health shows as Yellow - 解决方案/工作方法: 使用命令重启vAPI Endpoint service后该服务运行正常。 service-control --stop vmware-vapi-endpoint service-control --start vmware-vapi-endpoint VMware KB&…...
从零到一:基于TwinCAT3的巴鲁夫IO-Link模块实战配置指南
1. 环境准备与软件安装 第一次接触TwinCAT3和巴鲁夫IO-Link模块时,我花了整整两天时间才搞明白环境配置的门道。现在回想起来,其实只要抓住几个关键点就能少走弯路。首先需要准备的是TwinCAT3 XAE开发环境,建议直接去倍福官网下载最新版本。安…...
第5章 数据融合之道:多源文件的聚合与分发艺术
第5章 数据融合之道:多源文件的聚合与分发艺术 在数据分析的实战过程中,单一数据文件往往无法满足复杂业务需求。真实的商业场景中,数据可能分散在数十个甚至上百个Excel工作簿中,每个工作簿可能包含多个工作表。例如,连锁企业的各门店每日上传销售报表,财务系统每月导出…...
养狗管理拟参照道路交通法个人观点:计分、吊证、入刑,这些行为将被终身禁养
近年来,犬只伤人事件频发,每年全国被猫狗咬伤抓伤人数高达4000万。这一数字远超交通事故发生量,但长期以来,养犬管理始终停留在“办个证、罚点款”的层面。如果养犬管理能够参照道路交通安全法的逻辑,建立“记分制”“…...
YOLOv8改进系列:融入CBAM(卷积块注意力模块)——双管齐下,强化特征表达
摘要 在计算机视觉领域,目标检测任务要求模型不仅能识别出图像中的物体,还要精准定位其位置。YOLOv8作为当前最先进的单阶段目标检测器之一,凭借其高效的结构和优异的性能,在众多实际应用中大放异彩。然而,在面对复杂背景、小目标密集、遮挡严重等挑战性场景时,即使是YO…...
Mastering Multi-Step Time Series Forecasting: Strategies and Practical Applications
1. 多步时间序列预测入门指南 想象一下你正在规划下周的户外活动,如果能提前知道未来7天的气温变化,是不是就能完美避开雨天?这就是多步时间序列预测的典型应用场景。与常见的单步预测不同,多步预测需要一次性预测未来多个时间点的…...
Python豆瓣图书数据可视化平台 Flask框架 可视化 爬虫 书籍 大数据 机器学习 计算机毕业设计(建议收藏)✅
博主介绍:✌全网粉丝10W,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,…...
T样条实战:如何在Autodesk Fusion360中设计汽车B柱并导入LS-DYNA分析
T样条在汽车B柱设计与LS-DYNA仿真中的全流程实战 1. 工业设计新范式:T样条技术解析 在汽车工业设计领域,T样条技术正逐渐成为复杂曲面建模的首选方案。与传统NURBS相比,T样条允许每个面存在多个特殊点(EP),这一特性使其在保持曲面…...
提示工程架构师必备的零样本学习实践技巧
提示工程架构师必备的零样本学习实践技巧:让模型“无师自通”的艺术 一、引入与连接:当“未见过的任务”突然降临 凌晨3点,你正在加班处理项目,产品经理发来紧急需求:“我们需要一个能识别‘新能源汽车用户投诉意图’的…...
从零理解UDS故障码:手把手教你解读0x19服务返回的DTC状态位
汽车诊断技术实战:深入解析UDS协议中的DTC状态位机制 1. 汽车电子诊断技术基础 现代汽车已演变为高度复杂的电子系统集合体,平均每辆新车包含超过100个电子控制单元(ECU),这些ECU通过车载网络相互连接。当这些系统出现异常时,统一…...
金蝶EAS uploadlogo漏洞实战:如何快速检测你的系统是否受影响
金蝶EAS系统安全检测指南:快速识别uploadlogo漏洞风险 企业级财务管理系统作为核心业务支撑平台,其安全性直接关系到企业财务数据与商业机密的保护。近期曝光的金蝶EAS uploadlogo组件任意文件上传漏洞,可能成为攻击者入侵企业内网的突破口。…...
