1.4~1.9 静态库和动态库

简介: 1.4~1.9 静态库和动态库

1. 静态库


1.1 静态库的制作


什么是库:



* 静态库在链接阶段被复制到了程序中
* 动态库在运行时由系统动态加载到内存中
* Linux下静态库为.a文件
* Linux下动态库为.so文件


静态库的制作:



制作流程



sudo apt install tree


gcc -c add.c div.c mult.c sub.c
ar rcs libcalc.a add.o sub.o mult.o div.o   #生成静态库




1.2 静态库的使用


libcalc.a复制到lib下



gcc main.c -o app -I ./include/ -l calc -L ./libl


-i指定搜索head.h路径


-L指定库的路径


-l指定库的名字



2. 动态库


2.1 动态库的制作



静态库和动态库区别:



zdb@zdb-virtual-machine:~/linux/lession06$ cd calc
zdb@zdb-virtual-machine:~/linux/lession06/calc$ gcc -c -fpic add.c div.c mult.c sub.c
zdb@zdb-virtual-machine:~/linux/lession06/calc$ gcc -shared add.o sub.o div.o mult.o -o libcalc.so
zdb@zdb-virtual-machine:~/linux/lession06/calc$ cd ..
zdb@zdb-virtual-machine:~/linux/lession06$ cd library/
zdb@zdb-virtual-machine:~/linux/lession06/library$ gcc main.c -o main
main.c:2:18: fatal error: head.h: 没有那个文件或目录
compilation terminated.
zdb@zdb-virtual-machine:~/linux/lession06/library$ gcc main.c -o main -I include/
/tmp/ccFuca5B.o:在函数‘main’中:
main.c:(.text+0x38):对‘add’未定义的引用
main.c:(.text+0x58):对‘subtract’未定义的引用
main.c:(.text+0x78):对‘multiply’未定义的引用
main.c:(.text+0x98):对‘divide’未定义的引用
collect2: error: ld returned 1 exit status
zdb@zdb-virtual-machine:~/linux/lession06/library$ gcc main.c -o main -I include/ -L lib/ -l calc
zdb@zdb-virtual-machine:~/linux/lession06/library$ tree
.
├── include
│   └── head.h
├── lib
│   └── libcalc.so
├── main
├── main.c
└── src
    ├── add.c
    ├── div.c
    ├── mult.c
    └── sub.c
3 directories, 8 files
zdb@zdb-virtual-machine:~/linux/lession06/library$ ./main
./main: error while loading shared libraries: libcalc.so: cannot open shared object file: No such file or directory


  • -I:指定包含头文件路径


  • -L:指定动态库路径


  • -l:指定库的名字


2.2 动态库加载失败的原因


ldd能够查询运行需要的环境



进行链接时,动态库的代码不会被打包到可执行文件中,通过动态载入器动态的载入


动态载入器搜索库的绝对路径


搜索库的路径有顺序


因为没有找到库的路径


2.3 解决动态库家加载失败问题


env指令可以查询环境:键值对形式显示



方法一:LD_LIBRARY_PATH


临时的配置方法


export指令可以添加环境


echo指令可以查看指定环境


ldd指令可以查看对应代码需要的环境



用户级别


重新打开终端,你会发现失效了:



在家目录下打开.bashrc,末尾添加环境


export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/zdb/linux/lession06/library/lib


source确定



系统级别


  1. 打开./etc/profile,添加环境




成功!中间需要等待一段时间,一下子查询不到环境



方法二:/etc/ld.so.cache文件列表


  1. 打开指定文件


sudo gedit /etc/ld.so.conf


  1. 添加环境



刷新环境


sudo ldconfig   #刷新


3. 静态库和动态库的对比



静态库和动态库都是在链接阶段做的处理


静态链接方式和动态链接方式





目录
相关文章
|
2月前
|
Linux Windows
静态库和动态库
本文详细介绍了静态库和动态库的概念及使用方法。在 Linux 系统中,静态库以 `libxxx.a` 形式存在,而动态库则为 `libxxx.so`。文章分别讲解了如何创建和使用这两种库,并提供了具体的命令示例。此外,还介绍了将库文件添加到系统目录的方法,包括直接复制到默认库路径、修改环境变量以及编辑系统配置文件等方案。适合初学者了解库文件的基本操作。
|
6月前
|
Linux 编译器 开发者
C/C++动态库与静态库 的详细解析
C/C++动态库与静态库 的详细解析
648 0
|
6月前
|
消息中间件 NoSQL Linux
静态库与动态库
静态库与动态库
静态库与动态库
vs2019使用静态库
vs2019使用静态库
302 0
|
存储 Cloud Native Linux
C++ 动态库与静态库的区别?
C++ 动态库与静态库的区别?
|
存储 Linux 编译器
什么是链接库 | 动态库与静态库
什么是链接库 | 动态库与静态库
159 0
|
Shell 开发工具 iOS开发
动态库下(5)
动态库下(5)
374 0
动态库下(5)
|
Shell 开发工具 C语言
动态库与静态库
本文目标:⭐认识动态静态库,学会结合gcc选项,制作动静态库⭐⭐了解动态库加载过程⭐。
动态库与静态库
|
vr&ar C语言 索引
静态链接和静态库
静态链接和静态库
173 0
vs2019使用动态库
vs2019使用动态库
210 0