文章目录
- 1. 静态库
 
- 1.1 静态库的制作
 - 1.2 静态库的使用
 
- 2. 动态库
 
- 2.1 动态库的制作
 - 2.2 动态库加载失败的原因
 - 2.3 解决动态库家加载失败问题
 
- 方法一:LD_LIBRARY_PATH
 
- 临时的配置方法
 - 用户级别
 - 系统级别
 
- 方法二:/etc/ld.so.cache文件列表
 
- 3. 静态库和动态库的对比
 
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确定

系统级别
- 打开
./etc/profile,添加环境
成功!中间需要等待一段时间,一下子查询不到环境 
方法二:/etc/ld.so.cache文件列表
- 打开指定文件
 
sudo gedit /etc/ld.so.conf
- 添加环境
 - 刷新环境
 
sudo ldconfig #刷新
3. 静态库和动态库的对比

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




                










