【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。 中间部分为库名。

.o的程序文件在链接静态库时,是把整库拷贝到目标程序文件中。这种链接成为静态链接。静态链接之后,目标程序文件就和静态库没有任何关联了
静态库之作用与程序的链接阶段

动态库

命名格式为:lib____.so   前缀为lib,后缀为.so。 中间部分为库名。

对于动态库的链接,可以理解为是把库方法的地址给给目标文件

如果一个进程需要动态库,动态库就要被加载到内存。如果多个进程共同使用一个动态库,这个动态库也可以称为共享库

制作动静态库

制作静态库

1.把可执行程序编译成.o文件,也就是二进制文件

2.将这些二进制文件用ar工具打包,就形成静态库啦

示例

 ar -rc libmymath.a add.o sub.o
ar gnu 归档工具, rc 表示 (replace and create)
制作动态库(以C为例):
1.用gcc把可执行程序编译成.o文件,带上 -fPIC选项,-fPIC表示与位置无关码
2.用gcc把.o文件打包成动态库,带上c -shared 选项, shared表示生共享库格式
示例
 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指令更新

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DDK电通拧紧MFC-S060控制器过流维修

一、DDK伺服拧紧轴控制器过流故障的成因 1. 电源电压过低&#xff1a;当电源电压过低时&#xff0c;控制器可能会出现过流现象。 2. 负载过大&#xff1a;当负载过大时&#xff0c;DDK电通拧紧机控制器MFC-S060的电流也会随之增大&#xff0c;可能导致过流故障。 3. 控制器内部…

开箱即用:一个易用的开源表单工具!【送源码】

随着互联网的普及&#xff0c;表单应用场景越来越广泛&#xff0c;从网站注册、调查问卷到考试测评&#xff0c;无处不在。传统的表单制作方式需要一定的代码基础&#xff0c;对于不懂编程的小伙伴来说&#xff0c;无疑是一道门槛。 今天&#xff0c;给大家分享一款开源的表单…

如何理解redis是单线程的

写在文章开头 在面试时我们经常会问到这样一道题 你刚刚说redis是单线程的&#xff0c;那你能不能告诉我它是如何基于单个线程完成指令接收与连接接入的&#xff1f;这时候我们经常会得到沉默&#xff0c;所以对于这道题&#xff0c;笔者会直接通过3.0.0源码分析的角度来剖析…

[数据集][目标检测]花生米计数霉变检测数据集VOC+YOLO格式387张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;387 标注数量(xml文件个数)&#xff1a;387 标注数量(txt文件个数)&#xff1a;387 标注类别…

使用Leaflet和瓦片地图实现离线地图的技术指南

引言 在现代的Web应用中&#xff0c;地图服务扮演着越来越重要的角色。然而&#xff0c;在一些特殊环境下&#xff0c;如偏远地区或网络环境不稳定的情况下&#xff0c;依赖在线地图服务可能会受到限制。因此&#xff0c;实现离线地图功能成为了一个重要的需求。本文将介绍如何…

Redis入门与应用(1)

Redis的技术全景 Redis是一个开源的基于键值对&#xff08;Key-Value&#xff09;的NoSQL数据库&#xff0c;使用ANSI C语言编写&#xff0c;支持网络&#xff0c;基于内存但支持持久化。它性能优越&#xff0c;并提供多种语言的API。我们可以将Redis视为一个巨大的Map&#x…

秋招突击——第九弹——Redis缓存

文章目录 引言正文缓存基础旁路缓存模式&#xff08;重点&#xff09;读穿透&#xff08;了解&#xff09;写穿透&#xff08;了解&#xff09;异步缓存写入模式面试重点 缓存异常场景缓存穿透缓存击穿缓存雪崩面试重点 缓存一致性怎么保证&#xff1f;缓存一致性问题是什么方案…

[职场] 策略运营求职简历范文精选 #知识分享#微信#微信

策略运营求职简历范文精选 策略运营是用户运营的一种模式&#xff0c;主要针对于用户量级在千人到百万人规模的运营。下面是策略运营求职简历范文精选&#xff0c;供大家参考。 个人信息 姓名&#xff1a;蓝山 年龄&#xff1a;33岁 地址&#xff1a;北京 工作经验&#x…

C++STL梳理

CSTL标准手册&#xff1a; https://cplusplus.com/reference/stl/ https://cplusplus.com/reference/vector/vector/at/ 1、STL基础 1.1、STL基本组成(6大组件13个头文件) 通常认为&#xff0c;STL 是由容器、算法、迭代器、函数对象、适配器、内存分配器这 6 部分构成&…

icloud 邮箱登入失败

APP NAME mail2HOSTING APP NAME cloudos2CLIENT TIME Tue Jun 11 2024 09:00:47 GMT0800 (中国标准时间) (1718067647802)USER AGENT Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/125.0.0.0 Safari/537.36HOSTNAME www.icloud.…

使用阿里开源的Spring Cloud Alibaba AI开发第一个大模型应用

背景 前段时间看到Spring推出了SpringAI&#xff0c;可以方便快速的接入ChatGPT等国外的大模型&#xff0c;现在阿里巴巴也紧追脚步推出了Spring Cloud Alibaba AI&#xff0c;Spring Cloud Alibaba AI 目前基于 Spring AI 0.8.1 版本 API 完成通义系列大模型的接入。通义接入…

【Spine学习15】变换约束

变换约束&#xff1a;能让一个骨骼受另一个骨骼的变化影响。 1、选择m创建一个变换约束&#xff1a; 2、点击这个约束&#xff0c; 将移动数值拉的越满&#xff0c;m越接近s骨骼 当约束为0也就是默认的时候&#xff0c;m骨骼将不会受影响&#xff0c;变换约束可有可无。 tips…

Mysql简述

Java - sql语句学习 sql分类 sql语句 sql数据类型

《数字图像处理》实验报告一

一、实验任务与要求 1、用 matlab 编写空间域点处理操作处理给定的几幅图像&#xff0c;要求&#xff1a; 使用 imread 读取当前工作目录下的图像设计点处理操作并用代码实现处理用 imnshow 显示处理后的图像用 imwrite 保存处理后的图像 2、提交内容&#xff1a;m文件 实验…

ARM单片机使用CAN总线部署BootLoader

1.引言 1.1.单片机开发BootLoader意义 单片机开发BootLoader的原因主要与其在嵌入式系统中的关键作用有关。BootLoader是硬件启动的引导程序&#xff0c;它在操作系统内核或用户应用程序运行之前执行。以下是单片机开发BootLoader的主要原因&#xff1a; 初始化硬件设备&…

算法设计与分析:并查集法求图论桥问题

目录 一、实验目的 二、问题描述 三、实验要求 四、算法思想 1. 基准算法 1.1 算法思想 1.2 代码 1.3 时间复杂度 2. 使用并查集的高效算法 2.1 算法思想 2.2 代码&#xff1a; 2.3 时间复杂度&#xff1a; 五、实验结果 一、实验目的 1. 掌握图的连通性。 2. 掌…

卷积的通俗解释

以时间和空间两个维度分别理解卷积&#xff0c;先用文字来描述&#xff1a; 时间上&#xff0c;任何当前信号状态都是迄至当前所有信号状态的叠加&#xff1b;时间上&#xff0c;任何当前记忆状态都是迄至当前所有记忆状态的叠加&#xff1b;空间上&#xff0c;任何位置状态都…

python怎样自动提示

第一步、打开pycharm&#xff0c;如下图所示&#xff1a; 第二步、File→Power Save Mode&#xff0c;把下面如图所示的勾去掉&#xff1a; 第三步、去掉勾后&#xff0c;不再使用省电模式&#xff0c;新建一个python文件。输入单词前两个字母&#xff0c;就会自动提示了&#…

为什么说大模型训练很难?

前言 在人工智能的浪潮中&#xff0c;大模型训练无疑是一股不可忽视的力量。然而&#xff0c;这背后的过程却充满了挑战与困难。今天&#xff0c;让我们一同揭开大模型训练的神秘面纱&#xff0c;探讨为何它值得您的关注与投入。 大模型训练的挑战 大模型训练之所以难&…

选择门店收银系统要考虑哪些方面?美业系统Java源码分享私

开店前的一个重要事件就是选择门店收银软件/系统&#xff0c;尤其是针对美容、医美等美业门店&#xff0c;一个优秀专业的系统十分重要&#xff0c;它必须贴合门店的经营需求&#xff0c;提供更全面、便捷、高效的管理功能&#xff0c;帮助提升门店的服务质量和经营效益。 以下…