【Linux操作系统】动态库,静态库的制作和使用,软链接、硬链接简介

article/2025/10/31 2:48:26

目录

  • 软硬链接
    • 咋创建一个软链接?
    • 咋创建一个软链接?
  • 文件的三个时间
  • 动静态库
    • 制作静态库
    • 静态库的使用
    • 制作动态库
    • 动态库的使用

秃头侠们好呀,今天来说 软硬连接,动静态库

软硬链接

咋创建一个软链接?

ln -s log.txt log.s 这个意思就是让log.s->log.txt

在这里插入图片描述

unlink log.s删除软链接关系

软链接相当于Windows的快捷方式,比如在linux中有一个执行程序比较深,需要./xxx/xxx/xx/....才能运行,我就可以使用mytest->test,然后通过./mytest执行test

软链接文件具有独立的inode,所以软链接是一个独立的文件,只是它通过数据中保存的源文件路径,访问源文件,源文件被删除,则无法再访问。

咋创建一个软链接?

ln test.c hard 这就是硬链接

在这里插入图片描述
在这里插入图片描述
我们发现硬链接的inode和源文件的相同。
所以硬链接本质不是一个独立的文件,而是一个文件名和inode编号的映射关系。

创建硬链接做了什么?
本质是在特定目录下,填写一对文件名与inode的映射关系。
在这里插入图片描述我们来说一下这个数是啥玩意
在这里插入图片描述这个表示该文件对应的硬链接数(有几个文件名指向我),现在test有自己还有hard所以这个数为2。
这个数在inode的结构体内(引用计数)。

在这里插入图片描述为什么创建目录,它的默认硬链接数为2?
因为该目录里还有一个隐藏文件.也是指向当前目录的,如果在该目录再创建一个目录,则硬链接数变为3,因为里面的目录里还有一个..指向上级目录。

文件的三个时间

在这里插入图片描述
Access:
文件最近被访问的时间。
(但文件最经常被访问,所以这个时间要经常被改,那么OS会很慢,所以在较新的Linux内核中,Access时间不会立即更新,而是在一定的时间间隔,OS才会自动更新)。
Modify:
最近一次修改文件内容的时间(修改文件内容,很有可能更改文件的大小,那文件的属性就也变了,所以经常Modify时间改变,change时间也跟着变了)。
Change:
最近一次修改文件属性的时间。

所以现在我们知道我们Makefile中,它怎么知道你test.c是否是新修改的?就是通过test.c与test比较,如果test.c的Modify时间比test新,说明test.c被新修改了,否则就不准你make了,而make clean可以一直执行,那是因为让其不关心时间,直接执行就行了。
在这里插入图片描述当我们touch 一个存在的文件,那么三个时间都会改变,那你也就可以再make了。

总结一下:
Makefile和gcc会根据时间问题,来判断源文件和可执行程序谁更新,从而指导系统哪些源文件需要重新编译。

动静态库

静态库:是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”。

动态库:与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”。

ldd test 显示可执行程序依赖的库
在这里插入图片描述Linux中一般分为:静态库 动态库

静态库:库文件是以.a作为后缀。
动态库:库文件是以.so作为后缀。
(库文件也是文件,就是一个正常的磁盘文件)

库文件的命名:libxxx.so libxxx.a

库的真实名字:去掉lib前缀,去掉.a- .so-(包含)的后缀剩下的就是库的名字。

c++的源文件后缀有.cc .cpp .cxx

如果想静态编译:
gcc -o test test.c -static
静态编译的体积较大
file test
在这里插入图片描述

制作静态库

库本身是二进制文件,那我们如何得知,一个库给我们提供了什么方法呢?

所以一套完整的库包含:
库文件本身+头文件+说明文档
(头文件是文本的,会说明库中暴露出来的方法和基本使用)。

我们在写C/C++代码时,为何要.h放声明,.cpp放实现?
:因为我们要制作库,方便设计,私密和方便维护。

如果我们想把我们实现的方法卖给别人用:
第一种:源代码+头文件。
第二种:只给你提供.o(二进制)文件,可以让你链接,将所有.o打包就是静态库+头文件。

现在要开始创建静态库了!
我们先在Static_lib目录下创建sum.h sum.c sub.h sub.c文件,分别是加法的定义,加法实现,减法定义,减法实现。

现在创建Makefile
在这里插入图片描述在这里插入图片描述

现在我们就已经制作出一个静态库libmymath.a
并且把静态库和头文件打包到output文件中。

静态库的使用

我们把这个output文件拷贝到目标目录下,比如这个目录名是friend,则该目录下,有output和你朋友的可执行程序test.c

在这里插入图片描述此时静态库的使用也就完成了。

但是我们之前写的代码也用库了,为什么就没有指明选项呢?

因为之前的库就在默认路径下/lib64 /usr/lib64…编译器是能识别这些路径的,我们也可以把头文件和库文件写到默认路径,但不建议。

上面的过程也就是一般软件的安装过程。

所以总结一下:
静态库的使用就是:我们给别人交付的其实就是一个库文件(二进制)+一套头文件。

制作动态库

同样我们先在Dynamic_lib目录下创建sum.h sum.c sub.h sub.c文件,分别是加法的定义,加法实现,减法定义,减法实现。

现在创建Makefile
在这里插入图片描述在这里插入图片描述
然后把lib打包好的动态库拷贝到你friend目录下。
在这里插入图片描述

动态库的使用

在这里插入图片描述编译链接跟静态库一样。

但是我们发现,编译正常,但是./mytest为什么无法运行!?
因为:
在这里插入图片描述./mytest ->加载器,所以需要在运行的时候,进一步告诉系统我们的库在哪里!
怎么办?

方法一:

LD_LIBRARY_PATH ->指明程序启动后,库的搜索路径。
进入我们刚才打包好的的lib,然后把当前路径加入到环境变量中。

export LD_LIBRARY_PATH=/home/zhoukeren/Dynamic_lib/friend/lib

在这里插入图片描述

这样就解决了。
当然这个方法是临时的,当我们退出终端,再看一下:
echo $ LD_LIBRARY_PATH刚才加的路径就没了,但这个方法比较推荐。

方法二:

永久添加(到配置文件)不推荐。

/root
cd /etc/ld.so.conf.d/
touch zkr.conf
vim zkr.conf

在这里把刚才那个lib路径添加进来,这样就永久配置了。

总结一下:
我们一直都在直接或间接使用库(C/C++)
如何使用?拿别人的库和头文件,加入到自己的项目中。

如何制作:所有源代码,都要先被编译成.o(可重定向目标文件)
1、先把自己的所有源文件编译成.o
2、制作动静态库的本质:就是将所有的.o打包,使用ar -rc ; gcc -shared
3、交付:头文件+.a或者.so文件

编译器默认使用动态链接,如果想用静态,就手动加-static

为什么我们之前所写的所有代码都没有报错呢?
默认是使用动态链接,而我们一定有动态库,因为系统中有很多命令是用C写的,而且是动态链接的。

  • gcc -shared -o libmytest.so test.o生成动态库。
  • ar -rc libmytest.a test.o 生成静态库。
  • 库文件不能有main()函数,因为库文件会被其他主程序使用,因此包含main()会造成冲突。
  • gcc -o test test.c -I./lib -L./lib -l mytest

动态库的优点

共享、开发模式好、减少页面交换
动态库被加载在内存中,可以供多个使用库的程序共享映射到自己的虚拟地址空间去使用,因此可以减少页面交换以及降低内存中代码冗余,并且因为与源程序模块分离,因此开发模式比较好。


⭐感谢阅读,我们下期再见
如有错 欢迎提出一起交流


http://chatgpt.dhexx.cn/article/PVDEsmYh.shtml

相关文章

【Linux】零基础学习动静态库打包

文章目录 一、软硬链接二、动静态库理解动静态库静态库的打包使用静态库打包Makefile编写动态库的打包使用动态库打包Makefile编写对于小版本的理解 总结 一、软硬链接 站在先前的讲过的文件系统的角度来看,下图test这个文件有自己独立的inode,在他的ino…

Linux | 动静态库 | 动静态链接 | makefile库打包 | 第三方库使用

文章目录 何为动静态库库文件的链接静态链接静态库打包动态链接动态库打包 第三方库的使用静态库的使用动态库的使用 在系统层面上的动态链接理解 何为动静态库 静态库(.a):在程序编译链接时将静态库二进制码拷贝到程序代码中,程序运行时不再需要外部的静…

覆盖libc.so.6的惨痛教训

覆盖libc.so.6的惨痛教训 背景问题原因解决1、当前session未断开2、OS崩溃重启,所有ssh session断开 惨痛教训1、对于上产环境的内核依赖库文件不能随意覆盖、删除。2、 scp 文件覆盖问题 总结参考 背景 发生时间: 2022年11月28日08:55:20 偷了个懒,在安…

【Linux】自动生成makefile(ubuntu)

文章目录 前言一、Automake工具二、具体步骤1.下载Automake2.autoscan3.重命名configure.scan为configure.ac4.修改重命名后的configure.ac5.执行aclocal命令6.autoheader7.autoconf8.创建Makefile.am9.automake10.执行configure11.执行make12.执行Makefile编译完生成的可执行文…

【Linux】基础IO —— 下(实现动静态库)

🎇Linux:基础IO 博客主页:一起去看日落吗分享博主的在Linux中学习到的知识和遇到的问题博主的能力有限,出现错误希望大家不吝赐教分享给大家一句我很喜欢的话: 看似不起波澜的日复一日,一定会在某一天让你看…

【Linux】第九章 动态库和静态库(生成原理+生成和使用+动态链接)

🏆个人主页:企鹅不叫的博客 ​ 🌈专栏 C语言初阶和进阶C项目Leetcode刷题初阶数据结构与算法C初阶和进阶《深入理解计算机操作系统》《高质量C/C编程》Linux ⭐️ 博主码云gitee链接:代码仓库地址 ⚡若有帮助可以【关注点赞收藏】…

Linux——自动化编译(make的使用)、库文件(静态库和共享库的使用)

一、make的使用(自动化编译) make是Linux上的工程管理工具,可以实现自动化编译;make可以提高我们的编译效率。 1.安装make 命令:sudo apt install make 2.make的用法 (1)创建makefile文件&am…

rpc系列-ZooKeeper

一.简介 Zookeeper是一个分布式协调服务,就是为用户的分布式应用程序提供协调服务。 Zookeeper本身就是一个分布式程序(只要有半数以上节点存活,zk就能正常服务)。 Zookeeper所提供的服务涵盖:主从协调、服务器节点…

HBase 一文读懂

本文基于《尚硅谷大数据技术之HBase》编写。 HBase 简介 HBase定义 HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库。 HBase数据模型 HBase的数据模型同关系型数据库(RDMS)很类似,数据存储在一张表中,有行有列。但从H…

Zookeeper学习

文章目录 今日目标apache zookeeperzookeeper的概念分布式和集群的理解zookeeper的集群架构和角色zookeeper的5大特性部署zookeeper集群环境计算机集群的安装部署三台节点(克隆两台)配置节点内存和CPUzookeeper安装 zookeeper的数据模型zookeeper的节点类…

Redission和Zookeeper分别实现分布式锁

Redission和Zookeeper分别实现分布式锁(windows) 1、Redission实现分布式事务 1.1 前提准备 下载好nginx(windows版本)下载好Jmeter(模仿高并发)下载好redis(windows版) 1.2 代码…

Zookeeper 客户端之基本操作指令

ZooKeeper命令行工具类似于Linux的shell环境,不过功能肯定不及shell啦,但是使用它我们可以简单的对ZooKeeper进行访问,数据创建,数据修改等操作. 命令行工具的一些简单操作如下: zkCli.sh客户端连接命令 ls 与 ls2 命…

kafka内置zookeeper启动失败报错INFO ZooKeeper audit is disabled. (org.apache.zookeeper.audit.ZKAuditProvider)

kafka内置zookeeper启动失败报错INFO ZooKeeper audit is disabled.(org.apache.zookeeper.audit.ZKAuditProvider)2022年新版win10安装kafka 安装配置kafka,在启动zookeeper时报错ZooKeeper audit is disabled 原因分析: 寻找资料发现是zookeeper设置参…

zookeeper日志及快照清理操作

事务日志可视化转换 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #!/bin/sh # scriptname: zkLog2txt.sh # zookeeper事务日志为二进制格式,使用LogFormatter方法转换为可阅读的日志 if [ -z "$1" -o "$1" "-h&quo…

【RPC】注册中心实现方案之ZooKeeper

文章目录 ZooKeeper一致性协议:ZAB ZooKeeper ZooKeeper是一个开源的分布式协调服务,它可以用来协调和同步多服务器之间的状态。 ZooKeeper 可以作为微服务架构中注册中心的选型,它最需要被关心的也是数据模型和一致性协议。数据模型关乎服…

Linux 搭建zookpeer集群和配置

zookpeer和JDK1.8下载地址 下载地址:zookpeer和jdk1.8 提取码:w189 解压以及配置zookpeer tar -zxvf zookeeper-3.4.6.tar.gz tar -zxvf jdk-8u144-linux-x64.tar.gz 基本参数配置 参数描述clientPort主要定义客户端连接zookeeper server的端口&…

hadoop-zookeeper的详细介绍以及安装配置步骤

一、zookeeper的介绍 ZooKeeper是一个分布式的,开放源码的分布式应用程序协调服务,是Google的Chubby一个开源的实现,是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件,提供的功能包括:配置维护、…

k8s-7: kafka+zookeeper的单节点与集群的持久化

之前在k8s环境中有这个需求&#xff0c;看了好多的文档&#xff0c;都有坑&#xff0c;踩了一边总结一下&#xff0c;需要的朋友可自取 一、单节点部署 建议开发环境使用&#xff0c;且此处采用动态挂载的&#xff0c;生产不建议 1、安装zk cat > zk.yaml <<EOF a…

Docker 安装Zookeeper

第一步&#xff1a;查看本地镜像和检索拉取Zookeeper 镜像 # 查看本地镜像 docker images # 检索ZooKeeper 镜像 docker search zookeeper # 拉取ZooKeeper镜像最新版本 docker pull zookeeper:latest [rootlocalhost ~]# docker images REPOSITORY TAG …

mac pro m1:搭建zookeeper集群并设置开机自启

0. 引言 之前我们讲解过搭建zookeeper单节点&#xff0c;但在实际生产中&#xff0c;为了保证服务高可用&#xff0c;通常我们是采用集群模式。所以本次我们来实操集群模式的搭建 1. zk集群模式 zk可以作为注册中心和配置中心&#xff0c;常用在微服务各类组件的多节点服务治…