当前位置: 首页 > news >正文

【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指令更新

相关文章:

【linux】详解——库

目录 概述 库 库函数 静态库 动态库 制作动静态库 使用动静态库 如何让系统默认找到第三方库 lib和lib64的区别 /和/usr/和/usr/local下lib和lib64的区别 环境变量 配置相关文件 个人主页&#xff1a;东洛的克莱斯韦克-CSDN博客 简介&#xff1a;C站最萌博主 相关…...

RuntimeError: “exp_vml_cpu“ not implemented for ‘Half‘

遇到 "exp_vml_cpu" not implemented for Half 这个运行时错误&#xff0c;意味着你尝试在一个操作中使用了半精度&#xff08;Half 或 float16&#xff09;数据类型&#xff0c;但是该操作在当前环境下并没有针对半精度数据类型的实现。 半精度&#xff08;float16&…...

JVM之双亲委派机制

1.双亲委派机制 在Java中&#xff0c;类加载器具有层次结构。每个Java实现的类加载器中保存了一个成员变量叫“父”类加载器&#xff08;parent&#xff09;&#xff0c;可以理解为上级&#xff0c;并不是继承关系。应用程序类加载器的parent父加载器是扩展类加载器&#xff0…...

Gemalto SafeNet Luna HSM服务器硬件监控指标解读

在现代化的信息安全体系中&#xff0c;硬件安全模块&#xff08;HSM&#xff09;扮演着至关重要的角色&#xff0c;它负责保护和管理敏感的数据和密钥。Gemalto SafeNet Luna HSM作为一款高性能的硬件安全模块&#xff0c;广泛应用于金融、政府和企业等领域。为了确保Luna HSM的…...

计算机视觉与人工智能领域常用期刊和会议缩写

在撰写论文时有时候会面临超篇幅的情况&#xff0c;这时候一个常用的操作便是使用期刊&#xff08;会议&#xff09;的缩写或者半缩写来替换期刊&#xff08;会议&#xff09;全称 为了方便自己后续使用相关的缩写 特此整理 如有不当之处 欢迎大家指正~~ 计算机视觉与人工智能…...

ONLYOFFICE桌面编辑器8.1版:个性化编辑和功能强化的全面升级

ONLYOFFICE是一款全面的办公套件&#xff0c;由Ascensio System SIA开发。该软件提供了一系列与微软Office系列产品相似的办公工具&#xff0c;包括处理文档&#xff08;ONLYOFFICE Document Editor&#xff09;、电子表格&#xff08;ONLYOFFICE Spreadsheet Editor&#xff0…...

用一个实例看如何分享大量照片 续篇二,关于Exif (Exchangeable Image File) - 可交换图像文件

续篇二&#xff1a;说说关于照片隐含的 Exif (Exchangeable Image File) 可交换图像文件 数码照片的Exif 参数有很多&#xff0c;重要的Exif信息&#xff1a;拍摄日期、时间、拍摄器材、GPS信息。 当然这主要对自己的档案有意义&#xff0c;如果放到网上还是建议抹去这些信息。…...

使用Python自动化收集和处理视频资源的教程

在这篇教程中&#xff0c;我们将介绍如何利用Python脚本自动化收集和处理视频资源。这篇文章将帮助您掌握基本的网络自动化技术&#xff0c;并使用相关库进行视频资源的获取和保存。以下是具体的实现步骤和代码示例。 环境准备 在开始之前&#xff0c;请确保您的工作环境中已…...

字节数组输出流转换为Base64方法记录

1. 今天在做字节数组转换Base64的时候遇到一个问题&#xff0c;转换成的Base64字符串自动换行&#xff0c;导致传输失败 关键代码&#xff1a; ByteArrayOutputStream out new ByteArrayOutputStream(); ............. BASE64Encoder encoder new BASE64Encoder(); Stri…...

在eclipse中导入idea项目步骤

一、可以把其它项目的.project&#xff0c; .classpath文件拷贝过来&#xff0c;修改相应的地方则可。 1、.project文件只需要修改<name>xxx</name>这个项目名称则可 2、.classpath文件通常不用改&#xff0c; 二、右击 项目名 >选择“Properties”>选择 Re…...

海思SS928/SD3403开发笔记4——u盘挂载

首先一定要将u盘格式化成fat32。 挂载 mkdir /mnt/usb mount /dev/sda1 /mnt/usb成功示意图&#xff1a; 取消挂载 umount /mnt/usb...

偏微分方程算法之抛物型方程差分格式编程示例六(混合边界条件下C-N格式)

目录 一、研究问题 二、C++代码 三、计算结果 一、研究问题 对于混合边界条件下的抛物型偏微分方程求解,我们使用Crank-Nicolson格式(C-N格式),边界条件采用中心差商,即...

【5G核心网】5G NWDAF(Network Data Analytics Function)网元功能介绍

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 本人就职于国际知名终端厂商&#xff0c;负责modem芯片研发。 在5G早期负责终端数据业务层、核心网相关的开发工作&#xff0c;目前牵头6G技术研究。 博客内容主要围绕…...

今日思考分享:全网爆火的山东车牌之歌原因是什么?

山东车牌之歌的爆火反映了一种潜在而又浅显的需求被满足的过程。 首先&#xff0c;这首歌击中了人们的“潜”需求。在日常出行中&#xff0c;我们确实会偶尔对看到的不同地区车牌产生好奇&#xff0c;但往往这种好奇心一闪而过&#xff0c;没有具体的途径去满足。而山东车牌之歌…...

Spring Boot 2.x + Mybatis Plus 多数据源配置

MP官方文档提供有多数据源配置方案&#xff0c;这里没有使用其方案&#xff0c;原因是项目不想引入过多依赖 提供一下官网的文档供各位选择多数据源支持 | MyBatis-Plus (baomidou.com) 配置文件 application.properties文件配置两个数据源信息&#xff0c;yaml文件自行修改…...

2、数据库模型图、er图

关系 user和administarators是多对一的关系 user和order是一对多的关系 shipped和order是多对一的关系 order和books是多对多的关系 leavewords和order是一对一的关系 stock和books是一对多的关系 Chens 数据库表示法——ER图 Crows Foot数据库表示法——数据库模型图 Navicat表…...

Docker的理解

Docker的理解 Docker为什么用Docker&#xff1f;1.提升系统资源利用率2.更快速的交付和部署3.高效的部署和扩容4.更简单的管理 Docker核心技术Docker镜像Docker容器Docker仓库 Docker实现原理Linux NamespaceCgroupUnion FS Docker的应用场景1.微服务架构2.持续集成3.快速部署和…...

通信协议总结

IIC 基本特点 同步&#xff0c;半双工 标准100KHz&#xff0c;最高400KHz&#xff08;IIC主要应用于低速设备&#xff09; 硬件组成 需外接上拉电阻 通信过程 空闲状态 SDA和SCL都处于高电平 开始信号S和终止信号P 在数据传输过程中&#xff0c;当SCL0时&#xff0c;SDA才…...

Pinia + 组合式写法 + 选项式写法

选项式&#xff1a; 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

- 问题摘要&#xff1a;vAPI-Endpoint service health shows as Yellow - 解决方案/工作方法&#xff1a; 使用命令重启vAPI Endpoint service后该服务运行正常。 service-control --stop vmware-vapi-endpoint service-control --start vmware-vapi-endpoint VMware KB&…...

Flask RESTful 示例

目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题&#xff1a; 下面创建一个简单的Flask RESTful API示例。首先&#xff0c;我们需要创建环境&#xff0c;安装必要的依赖&#xff0c;然后…...

K8S认证|CKS题库+答案| 11. AppArmor

目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作&#xff1a; 1&#xff09;、切换集群 2&#xff09;、切换节点 3&#xff09;、切换到 apparmor 的目录 4&#xff09;、执行 apparmor 策略模块 5&#xff09;、修改 pod 文件 6&#xff09;、…...

8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂

蛋白质结合剂&#xff08;如抗体、抑制肽&#xff09;在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上&#xff0c;高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术&#xff0c;但这类方法普遍面临资源消耗巨大、研发周期冗长…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

Python爬虫实战:研究feedparser库相关技术

1. 引言 1.1 研究背景与意义 在当今信息爆炸的时代,互联网上存在着海量的信息资源。RSS(Really Simple Syndication)作为一种标准化的信息聚合技术,被广泛用于网站内容的发布和订阅。通过 RSS,用户可以方便地获取网站更新的内容,而无需频繁访问各个网站。 然而,互联网…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

sqlserver 根据指定字符 解析拼接字符串

DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...

基于TurtleBot3在Gazebo地图实现机器人远程控制

1. TurtleBot3环境配置 # 下载TurtleBot3核心包 mkdir -p ~/catkin_ws/src cd ~/catkin_ws/src git clone -b noetic-devel https://github.com/ROBOTIS-GIT/turtlebot3.git git clone -b noetic https://github.com/ROBOTIS-GIT/turtlebot3_msgs.git git clone -b noetic-dev…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

NPOI操作EXCEL文件 ——CAD C# 二次开发

缺点:dll.版本容易加载错误。CAD加载插件时&#xff0c;没有加载所有类库。插件运行过程中用到某个类库&#xff0c;会从CAD的安装目录找&#xff0c;找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库&#xff0c;就用插件程序加载进…...