【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&…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
基础测试工具使用经验
背景 vtune,perf, nsight system等基础测试工具,都是用过的,但是没有记录,都逐渐忘了。所以写这篇博客总结记录一下,只要以后发现新的用法,就记得来编辑补充一下 perf 比较基础的用法: 先改这…...

srs linux
下载编译运行 git clone https:///ossrs/srs.git ./configure --h265on make 编译完成后即可启动SRS # 启动 ./objs/srs -c conf/srs.conf # 查看日志 tail -n 30 -f ./objs/srs.log 开放端口 默认RTMP接收推流端口是1935,SRS管理页面端口是8080,可…...

EtherNet/IP转DeviceNet协议网关详解
一,设备主要功能 疆鸿智能JH-DVN-EIP本产品是自主研发的一款EtherNet/IP从站功能的通讯网关。该产品主要功能是连接DeviceNet总线和EtherNet/IP网络,本网关连接到EtherNet/IP总线中做为从站使用,连接到DeviceNet总线中做为从站使用。 在自动…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

RabbitMQ入门4.1.0版本(基于java、SpringBoot操作)
RabbitMQ 一、RabbitMQ概述 RabbitMQ RabbitMQ最初由LShift和CohesiveFT于2007年开发,后来由Pivotal Software Inc.(现为VMware子公司)接管。RabbitMQ 是一个开源的消息代理和队列服务器,用 Erlang 语言编写。广泛应用于各种分布…...

Ubuntu系统多网卡多相机IP设置方法
目录 1、硬件情况 2、如何设置网卡和相机IP 2.1 万兆网卡连接交换机,交换机再连相机 2.1.1 网卡设置 2.1.2 相机设置 2.3 万兆网卡直连相机 1、硬件情况 2个网卡n个相机 电脑系统信息,系统版本:Ubuntu22.04.5 LTS;内核版本…...

使用SSE解决获取状态不一致问题
使用SSE解决获取状态不一致问题 1. 问题描述2. SSE介绍2.1 SSE 的工作原理2.2 SSE 的事件格式规范2.3 SSE与其他技术对比2.4 SSE 的优缺点 3. 实战代码 1. 问题描述 目前做的一个功能是上传多个文件,这个上传文件是整体功能的一部分,文件在上传的过程中…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...

Qwen系列之Qwen3解读:最强开源模型的细节拆解
文章目录 1.1分钟快览2.模型架构2.1.Dense模型2.2.MoE模型 3.预训练阶段3.1.数据3.2.训练3.3.评估 4.后训练阶段S1: 长链思维冷启动S2: 推理强化学习S3: 思考模式融合S4: 通用强化学习 5.全家桶中的小模型训练评估评估数据集评估细节评估效果弱智评估和民间Arena 分析展望 如果…...