【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&…...
测试微信模版消息推送
进入“开发接口管理”--“公众平台测试账号”,无需申请公众账号、可在测试账号中体验并测试微信公众平台所有高级接口。 获取access_token: 自定义模版消息: 关注测试号:扫二维码关注测试号。 发送模版消息: import requests da…...
C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
遍历 Map 类型集合的方法汇总
1 方法一 先用方法 keySet() 获取集合中的所有键。再通过 gey(key) 方法用对应键获取值 import java.util.HashMap; import java.util.Set;public class Test {public static void main(String[] args) {HashMap hashMap new HashMap();hashMap.put("语文",99);has…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...
【免费数据】2005-2019年我国272个地级市的旅游竞争力多指标数据(33个指标)
旅游业是一个城市的重要产业构成。旅游竞争力是一个城市竞争力的重要构成部分。一个城市的旅游竞争力反映了其在旅游市场竞争中的比较优势。 今日我们分享的是2005-2019年我国272个地级市的旅游竞争力多指标数据!该数据集源自2025年4月发表于《地理学报》的论文成果…...
RKNN开发环境搭建2-RKNN Model Zoo 环境搭建
目录 1.简介2.环境搭建2.1 启动 docker 环境2.2 安装依赖工具2.3 下载 RKNN Model Zoo2.4 RKNN模型转化2.5编译C++1.简介 RKNN Model Zoo基于 RKNPU SDK 工具链开发, 提供了目前主流算法的部署例程. 例程包含导出RKNN模型, 使用 Python API, CAPI 推理 RKNN 模型的流程. 本…...
