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

article/2025/10/31 2:41:58

🏆个人主页:企鹅不叫的博客

​ 🌈专栏

  • C语言初阶和进阶
  • C项目
  • Leetcode刷题
  • 初阶数据结构与算法
  • C++初阶和进阶
  • 《深入理解计算机操作系统》
  • 《高质量C/C++编程》
  • Linux

⭐️ 博主码云gitee链接:代码仓库地址

⚡若有帮助可以【关注+点赞+收藏】,大家一起进步!

💙系列文章💙


【Linux】第一章环境搭建和配置

【Linux】第二章常见指令和权限理解

【Linux】第三章Linux环境基础开发工具使用(yum+rzsz+vim+g++和gcc+gdb+make和Makefile+进度条+git)

【Linux】第四章 进程(冯诺依曼体系+操作系统+进程概念+PID和PPID+fork+运行状态和描述+进程优先级)

【Linux】第五章 环境变量(概念补充+作用+命令+main三个参数+environ+getenv())

【Linux】第六章 进程地址空间(程序在内存中存储+虚拟地址+页表+mm_struct+写实拷贝+解释fork返回值)

【Linux】第七章 进程控制(进程创建+进程终止+进程等待+进程替换+min_shell)

【Linux】第八章 基础IO(open+write+read+文件描述符+重定向+缓冲区+文件系统管理+软硬链接)


文章目录

  • 💙系列文章💙
  • 💎一、动静态库原理
  • 💎二、静态库
    • 🏆1.特点
    • 🏆2.生成
      • 生成.o文件并且打包
      • 发布静态库
    • 🏆3.使用
      • 方法一:指定路径头文件搜索路径
      • 方法二:将头文件和库文件拷贝到系统路径下(不推荐)
  • 💎三、动态库
    • 🏆1.特点
    • 🏆2.生成
      • 生成,so文件并且打包
      • 发布动态库
    • 🏆3.使用
      • **动态库拷贝到系统路径干力1ib64-- 安装**(不推荐)
      • **更改`LD_LIBRARY_PATH`**
      • **系统配置文件**
    • 🏆4.动态链接


💎一、动静态库原理

源文件和头文件编程可执行程序需要进行一下四个步骤:

  1. 预处理: 完成头文件展开、去注释、宏替换、条件编译等,最终形成xxx.i文件。
  2. 编译: 完成词法分析、语法分析、语义分析、符号汇总等,检查无误后将代码翻译成汇编指令,最终形成xxx.s文件。
  3. 汇编: 将汇编指令转换成二进制指令,最终形成xxx.o文件。
  4. 链接: 将生成的各个xxx.o文件进行链接,最终形成可执行程序。

其中,我们可以将一堆.o文件打包成库

  • 在Linux当中,以.so为后缀的是动态库,以.a为后缀的是静态库。
  • 在Windows当中,以.dll为后缀的是动态库,以.lib为后缀的是静态库。

💎二、静态库

🏆1.特点

静态库(.a)是程序在编译链接的时候把库的代码拷贝到可执行文件当中的,生成的可执行程序在运行的时候将不再需要静态库。使用静态库生成的可执行程序会比一般程序大,同时也会占用大量的空间

🏆2.生成

示例生成一下四个代码,两个源文件,add.c和sub.c两个头文件add.h和sub.h

add.c

#include "add.h"
int add(int a, int b)
{return a + b;
}

add.h

#pragma onceextern int add(int a, int b);

sub.c

#include "sub.h"
int sub(int a, int b)
{return a - b;
}

sub.h

#pragma onceextern int sub(int a, int b);

生成.o文件并且打包

libcal.a:add.o sub.oar -rc libcal.a add.o sub.o
sub.o:sub.cgcc -c sub.c -o sub.o -std=c99//编译器版本低的话要加上这个,否则不用
add.o:add.cgcc -c add.c -o add.o.PHONY:clean
clean:rm -f *.o *.a

gcc -c mymath.c -o mymath.o:-c,生成.o文件,-o,重命名为mymath.o,可以简写为gcc -c mymath.c

ar -rc libmymath.a mymath.o myprint.o:ar命令是gnu的归档工具,常用于将目标文件打包为静态库,-r(replace):若静态库文件当中的目标文件有更新,则用新的目标文件替换旧的目标文件,-c(create):建立静态库文件

发布静态库

发布静态库有两个文件夹,include存放头文件合集,lib存放库合集

libcal.a:add.o sub.oar -rc libcal.a add.o sub.o
sub.o:sub.cgcc -c sub.c -o sub.o -std=c99//编译器版本低的话要加上这个
add.o:add.cgcc -c add.c -o add.o.PHONY:static//打包
static:mkdir -p staticlib/lib mkdir -p staticlib/includecp *.a staticlib/lib cp *.h staticlib/include.PHONY:clean
clean:rm -f *.o *.a

mkdir -p staticlib/ lib 创建一个路径staticlib/ lib
mkdir -p staticlib/ include 创建一个路径staticlib/ include
cp *.a staticlib/lib 把所有.a库文件拷贝进 lib路径下
cp *.h staticlib/ include 把所有.h头文件拷贝进第 include路径下

.PHONY:static//打包 make static将所有文件组织起来

🏆3.使用

  • ” ”:在当前路径下查找头文件
  • < > :在系统头文件路径下查找头文件

方法一:指定路径头文件搜索路径

  • -I:指定头文件搜索路径。
  • -L:指定库文件搜索路径。
  • -l:指明需要链接库文件路径下的哪一个库。

-I+你的头文件搜索路径(-l是include缩写,意为头文件) ,-L+你的库路径 即可(-L是link缩写,意为库),-l库名 (-l库名之间尽量不带空格)

gcc main.c -o main -I ./staticlib/include/ -L ./staticlib/lib/ -lcal

编译器不知道你所包含的头文件add.h在哪里,所以需要指定头文件的搜索路径,头文件add.h当中只有add函数的声明,并没有该函数的定义,所以还需要指定所要链接库文件的搜索路径,需要指明需要链接库文件路径下的哪一个库(库文件名去掉前缀lib,再去掉后缀.so或者.a),-I-L-l这三个选项后面可以加空格,也可以不加空格

方法二:将头文件和库文件拷贝到系统路径下(不推荐)

我们生成的库名叫,libcal.a去掉前称和后缀就是cal

将头文件和库文件拷贝到系统路径下

sudo cp staticlib/include/* /usr/include/
sudo cp staticlib/lib/libcal.a /lib64/

链接库时,指定使用的库,cal为去掉前称和后缀

gcc main.c -lcal

💎三、动态库

🏆1.特点

动态库(.so)是程序在运行的时候才去链接动态库的代码,多个程序共享使用库的代码。一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表,而不是外部函数所在目标文件的整个机器码。(即:动态库链接的可执行程序中如果调用外部函数时,程序里面只有函数的地址,函数的具体实现还在库中)动态库可以在多个程序间共享,所以动态链接使得可执行文件更小,节省了磁盘空间。

🏆2.生成

  • shared: 表示生成共享库格式,动态库打包的时候需要加上
  • fPIC:产生位置无关码,源文件编译成.o文件需要加上

生成,so文件并且打包

libcal.so:add.o sub.ogcc -shared -o libcal.so add.o sub.o
add.o:add.cgcc -fPIC -c add.c -o add.o -std=c99
sub.o:sub.cgcc -fPIC -c sub.c -o sub.o.PHONY:clean
clean:rm -rf *.o *.so

gcc -shared -o libcal.so add.o sub.o:生成动态库,需要在前面加上-shared

gcc -fPIC -c sub.c -o sub.o:生成.o文件需要在前面加上-fPIC

发布动态库

libcal.so:add.o sub.ogcc -shared -o libcal.so add.o sub.o
add.o:add.cgcc -fPIC -c add.c -o add.o -std=c99
sub.o:sub.cgcc -fPIC -c sub.c -o sub.o.PHONY:dyl//打包
dyl:makemkdir -p dyllib/lib mkdir -p dyllib/includecp *.so dyllib/lib cp *.h dyllib/include.PHONY:clean
clean:rm -rf *.o *.so

mkdir -p dyllib/ lib 创建一个路径dyllib/ lib
mkdir -p dyllib/ include 创建一个路径dyllib/ include
cp *.a dyllib/lib 把所有.a库文件拷贝进 lib路径下
cp *.h dyllib/ include 把所有.h头文件拷贝进第 include路径下

.PHONY:dyl//打包 make dyl将所有文件组织起来

🏆3.使用

指定路径头文件搜索路径:

-I+你的头文件搜索路径(-l是include缩写,意为头文件) ,-L+你的库路径 即可(-L是link缩写,意为库),-l库名 (-l库名之间尽量不带空格)

gcc main.c -o main -I ./dyllib/include/ -L ./dyllib/lib/ -lcal

与静态库的使用不同的是,此时我们生成的可执行程序并不能直接运行,必须让进程找到动态库

[Jungle@VM-20-8-centos:~/lesson24]$ ldd a.outlinux-vdso.so.1 =>  (0x00007ffe091a7000)libcal.so => not foundlibc.so.6 => /lib64/libc.so.6 (0x00007f6a85fae000)/lib64/ld-linux-x86-64.so.2 (0x00007f6a8657e000)

动态库拷贝到系统路径干力1ib64-- 安装(不推荐)

更改LD_LIBRARY_PATH

LD_LIBRARY_PATH是程序运行动态查找库时所要搜索的路径,我们只需将动态库所在的目录路径添加到LD_LIBRARY_PATH环境变量当中即可

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/Jungle/lesson24/dyllib/lib

重启xshell就还原了

系统配置文件

/etc/ld.so.conf.d/路径下存放的全部都是以.conf为后缀的配置文件,而这些配置文件当中存放的都是路径,系统会自动在/etc/ld.so.conf.d/路径下找所有配置文件里面的路径,之后就会在每个路径下查找你所需要的库。

在库路径下创建创建自己的配置文件

sudo touch /etc/ld.so.conf.d/dyl.conf

将路径写入配置文件

sudo vim /etc/ld.so.conf.d/dyl.conf

以下是写入内容

/home/Jungle/lesson24/dyllib/lib/

刷新配置文件

sudo ldconfig

删除系统配置文件

sudo rm /etc/ld.so.conf.d/dyl.conf

🏆4.动态链接

动态库是程序在运行的时候才去链接相应的动态库代码的,多个程序共享使用库的代码。一个与动态库链接的可执行文件仅仅包含它用到的函数入口地址的一个表。在可执行文件开始运行以前,外部函数的机器码由操作系统从磁盘上的该动态库中复制到内存中,这个过程称为动态链接(dynamic linking)

在这里插入图片描述



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

相关文章

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

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

rpc系列-ZooKeeper

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

HBase 一文读懂

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

Zookeeper学习

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

Redission和Zookeeper分别实现分布式锁

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

Zookeeper 客户端之基本操作指令

ZooKeeper命令行工具类似于Linux的shell环境&#xff0c;不过功能肯定不及shell啦&#xff0c;但是使用它我们可以简单的对ZooKeeper进行访问&#xff0c;数据创建&#xff0c;数据修改等操作. 命令行工具的一些简单操作如下&#xff1a; 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&#xff0c;在启动zookeeper时报错ZooKeeper audit is disabled 原因分析&#xff1a; 寻找资料发现是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事务日志为二进制格式&#xff0c;使用LogFormatter方法转换为可阅读的日志 if [ -z "$1" -o "$1" "-h&quo…

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

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

Linux 搭建zookpeer集群和配置

zookpeer和JDK1.8下载地址 下载地址&#xff1a;zookpeer和jdk1.8 提取码&#xff1a;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是一个分布式的&#xff0c;开放源码的分布式应用程序协调服务&#xff0c;是Google的Chubby一个开源的实现&#xff0c;是Hadoop和Hbase的重要组件。它是一个为分布式应用提供一致性服务的软件&#xff0c;提供的功能包括&#xff1a;配置维护、…

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;常用在微服务各类组件的多节点服务治…

一款实用的数据恢复软件—zook data recovery wizard

zook data recovery wizard是RecoveryTools下的一款子品牌&#xff0c;同时也是一款功能实用的数据恢复软件&#xff0c;该软件可以从Windows中恢复已删除&#xff0c;损坏&#xff0c;格式化和丢失的数据&#xff0c;能够支持从驱动器&#xff0c;SD卡&#xff0c;硬盘&#x…

zook 报错 Unable to read additional data from server sessionid 0x0

zook报错启动报错&#xff1a; 2017-09-25 18:33:46,913 - INFO [main-SendThread(localhost:2181):ClientCnxn$SendThread1183] - Unable to read additional data from server sessionid 0x0, likely server has closed socket, closing socket connection and attempting r…

hadoop大数据集群搭设(hadoop+zook+HBase+hive)百分百成功

hadoop大数据集群搭设 前言所需软件虚拟机准备工作一、Jdk安装二、安装zookeeper三、HBase安装四、mysql安装配置五、安装hive 前言 经过长时间的测试总结出在目前集群搭建最稳定的步骤是&#xff1a; 至少我按这个过程基本0失误&#xff0c;且初始化次数最少。当然也可以尝试…

zookeeper客户端命令(三)

zookeeper客户端命令&#xff08;三&#xff09; 问题背景zookeeper分布式技术基本概念&#xff08;一&#xff09;zookeeper单机及集群部署&#xff0c;附安装包下载&#xff08;二&#xff09;zookeeper客户端命令&#xff08;三&#xff09; zook客户端指令节点创建测试集群…

Zookper集群搭建

&#x1f345;程序员小王的博客&#xff1a;程序员小王的博客 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 如有编辑错误联系作者&#xff0c;如果有比较好的文章欢迎分享给我&#xff0c;我会取其精华去其糟粕 一、搭建zookper集群前的准备…

分布式系统服务框架Zookeeper介绍与原理实现

分布式数据管理之痛点 为了确保微服务之间松耦合&#xff0c;每个服务都有自己的数据库, 有的是关系型数据库&#xff08;SQL&#xff09;&#xff0c;有的是非关系型数据库&#xff08;NoSQL&#xff09;。 开发企业事务往往牵涉到多个服务&#xff0c;要想做到多个服务数据…