【linux】详解——库

embedded/2024/10/21 10:10:16/

目录

概述

函数

静态

动态

制作动静态

使用动静态

如何让系统默认找到第三方

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.ppmy.cn/embedded/54013.html

相关文章

如何在 HTML 中实现响应式设计以适应不同设备的屏幕尺寸?

要在HTML中实现响应式设计以适应不同设备的屏幕尺寸&#xff0c;可以使用CSS媒体查询和流动布局。 以下是实现响应式设计的一些关键步骤&#xff1a; 使用CSS媒体查询&#xff1a;CSS媒体查询允许根据屏幕尺寸和设备特性应用不同的CSS样式。通过在CSS中使用media规则&#xf…

ubuntu22.04下编译安装dlib

为什么要自己编译&#xff0c;请自行摆渡。 #--------------------------------------------------------------------------- # compile and inistall dlib C library #--------------------------------------------------------------------------- cd /opt mkdir dlib-ro…

react 使用 valtio

安装 npm i valtio//好用的storage npm i good-storage使用 src目录下创建store文件夹&#xff0c;新增两个文件 index.js export * from ./useruser.js import { proxy,subscribe } from valtio import {useProxy} from valtio/utils import ss from good-storage const k…

Grafana 对接 Zabbix 数据源API错误

介绍 主要报错为 Invalid params. Invalid parameter "/": unexpected parameter "user". 主要原因为Zabbix 6.4.0以上的版本更新了API&#xff0c;导致Grafana的数据源插件不兼容。 解决方案 更新到最新的Grafana 和 grafana-zabbix 插件即可。&#x…

1982Springboot宠物美容院管理系统idea开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot宠物美容院管理系统是一套完善的信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c;系 统具有完整的源代码和数据库…

使用adb shell getprop命令获取Android设备的属性

常用属性获取&#xff1a; adb shell getprop ro.build.version.emui —查询EMUI版本 adb shell getprop ro.product.brand —查询手机品牌 adb shell getprop ro.product.name --查询设备名称 adb shell getprop ro.serialno —查询设备序列号 获取手机系统信息( CPU,厂商…

Linux 搭建 kafka 流程

优质博文&#xff1a;IT-BLOG-CN 一、安装环境 【1】CenOS7虚拟机三台 【2】已经搭建好的zookeeper集群。 【3】软件版本&#xff1a;kafka_2.11-1.0.0 二、创建目录并下载安装软件 【1】创建目录 cd /opt mkdir kafka #创建项目目录 cd kafka mkdir kafkalogs #创建kafk…

【Python】易错题 [1]

目录 一、选择&#xff1a; 1.列表的复制​编辑 2.函数 二、填空 一、选择&#xff1a; 1.列表的复制 在Python中&#xff0c;列表是可变的数据类型。当将一个列表赋值给另一个变量时&#xff0c;实际上是将这个变量的引用指向原始列表。&#xff08;指针&#xff09;因此&…