动态库与静态库

1. 库

是代码的二进制的封装形式
在其他的源代码或库中,可以直接调用库的,但是又看不到它
没有公开源代码

库的这种实现方法有利于模块化 而且只要接口合理
不影响库的使用的

sum.c sum.h

int sum(int a,int b) {
return a+b;
}

xxx.c
需要使用sum 原来的做法 就是直接把源代码拷贝
(1)
直接给源代码,不利于知识产权的保护
想给你用,但是又让你知道,到底如何去实现的
(2)
加入有一天,sum文件的实现,更新换代了,使用sum的代码,需要重新编译,打包,下载

现在: 使用库

sum.c sum.h

int sum(int a,int b) {
return a+b;
}

编译,生成libxxxx.so(库的二进制)

xxx.c
想要去使用sum,直接链接到libxxx.so
=>a.out 运行a.out 加载libxxxx.so就可以了


动态库 和 静态库

2. 动态库

**动态库的使用步骤

  1. 制作动态库
    a.编辑源代码(库的代码)
    如:
    LinkedList.c 功能函数的实现
    LinkedList.h 接口文件
    库的源代码 不能包含 main函数
    b.生成动态库
    gcc(arm-linux-gcc) -shared -fpic -o libLinkedList.so LinkedList.c(可以根据自己需要多加其他的.c)
    把LinkedList.c编译成动态库,生成的动态库的名字 libLinkedList.so
    -shared 生成动态库
    -fpic 与位置无关
    -o 指定生成动态库的名字
    动态库的名字 一般都只以lib开头,以.so结尾的文件
    lib0-9a-zA-Z+\.so**

2. 使用动态库
a.把头文件和库拷给需要的人
xxx.c
<------LinkedList.h
<------libLinkedList.so
gcc xxx.c -I 目录1 -I 目录2 ...... -L 目录名字 -l LinkedList -o xxx
-I(i的大写) 接一个目录名,指定的头文件的搜索路径,可以接多个-I inlcude
-L 接一个目录名,指定后面的那个库的搜索路径
-l 库名,把lib .so去掉所剩下的就是库名
eg:
gcc xxx.c -I ../ -L ../ -l LinkedList -o xxx
执行上面的命令,会生成可执行文件xxx 并且这个可执行文件xxx 会使用到库libLinkedList.so
但是在生成xxx的时候,并没有把动态库中内容拷贝到xxx中,只是标记
xxx的运行,需要库的支持的
./link: error while loading shared libraries: libLinkedList.so: cannot open shared object file: No such file or directory
b. 最终运行使用库的那个可执行文件前,确保依赖库在
运行的系统中,只打需要在哪一个目录下搜索依赖库
环境变量
LD_LIBRARY_PATH
LD:loading 加载依赖库的路径
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:你的依赖库的路径 绝对路径
or
把依赖库,直接丢到LD_LIBRARY_PATH指定的路径中去
/usr/lib/

3. 静态库

1.制作静态库
1)编辑源代码
2)把所有的源代码编译成.o
gcc(arm-linux-gnueabi-gcc) -c xxx.c -o xxx.o
3)用ar命令把所有的.o文件打包,生成静态库
(arm-linux-gnueabi-)ar -rcs libxxxx.a a.o b.o
-r 更新
-c 创建
-s 创建索引
把a.o b.o打包生成静态库
libxxxx.a

2.使用
1)把静态库和头文件拷贝给别人
gcc(arm-linux-gnueabi-gcc) main.c -I ... -L ... -l xxxx -o main
2)直接把可执行文件下载到开发板,运行

4. 动态库与静态库的区别

二进制的封装
区别:
对于动态库,对使用动态库的代码 编译 并没有把动态库编译进去
仅仅做一个标记:我的这个可执行程序在运行,会用到某某某动态库
对于静态库,对使用静态库的代码 编译,只把静态库的内容拷贝到可执行文件当中
动态库的优点
当接口一致(函数名 参数 返回值)的时候,更新动态库,不需要重新编译依赖动态库的可执行程序 a.out
静态库 修改,则需要重新编译所依赖的可执行程序

相关推荐
INGNIGHT13 分钟前
270 · 电话号码的字母组合II(Trie)
linux·算法
zly350014 分钟前
VMware Converter Standalone 物理机转化为虚拟机后源1硬盘变成了2个硬盘(2个硬盘文件)虚拟机无法启动。
linux·运维·服务器
GeW2 小时前
从内核到数据:Linux与工业数据库如何支撑高端制造
linux
小小的木头人3 小时前
Linux systemd Service 与 Timer 定时任务原理及实战
linux
熊明才4 小时前
WSL2 网络突然瘫痪(Network is unreachable / 没有 eth0)最短修复指南(2026年9月20日亲测可用)
linux·windows·wsl2
Tairitsu_H4 小时前
[Linux系统] 自动化构建make / Makefile | 进度条
linux·操作系统·makefile·make
行者全栈架构师4 小时前
大模型运维准确率不到 50%?我们用 DeepSeek V4 测了 5 大场景,结果出人意料
linux·人工智能·开源
zzzyyy5385 小时前
TCP 协议学习笔记:从报文格式到异常处理
linux·网络
傲世仙尊6 小时前
ELF与动态库进阶-链接真相与GOT表
linux
M78佐菲6 小时前
ARM学习笔记(五)
linux·arm开发·笔记·嵌入式硬件·学习