静态库与动态库的制作与使用
静态库的制作与使用
静态库的制作
命名规则
- lib + 库的名字 + .a
- libmytest.a
制作步骤
- 生成对应的.o文件 --.c -->.o -c参数
将生成的.o文件打包 ar工具 ar rcs 生成静态库的名字(libMytest.a) 生成的所有的.o
gcc *.c -c -I ../include/ 头文件在include ar rcs libMyCalc.a *.o
发布和使用静态库
- 发布的静态库
- 发布头文件
使用静态库
gcc main.c lib/libMyCalc.a -I include/ -o sum gcc main.c -I include -L lib -l MyCalc -o myapp -I 指定头文件目录 -L 指定库目录 -l 指定使用哪个库 libMyCalc.a 需要去掉头尾 lib .a -o 生成二进制文件.o nm libMyCakc.a 可以查看有哪些.o
静态库优点
发布程序的时候,不需要提供对应的库
- 把库打包到对应的程序中,但是他只是用到那个.o的函数,则打包那个库中对应.o不是所有.o都打包了
- 库的加载速度快
静态库缺点
- 库被打包到应用程序中,导致应用的体积很大
- 库发生了改变,需要重新编译程序
共享库的制作与使用
共享库的制作
命名规则
- lib + 名字 + .so
制作步骤
- 生成与位置无关的代码(生成与未知无关的.o)
- 将.o打包成共享库(动态库)
gcc -fPIC -c *.c -I ../include/ gcc -shared -o libMyCalc.so *.o -I ../include
发布和使用动态库
- 发布动态库文件
- 发布头文件
使用动态库
gcc main.c lib/libMyCalc.so -o calc -I include/ 正确 gcc main.c -L lib -l MyCalc -o calc -I include/ 正确 但是↓ ./calc 会报下面错误 error while loading shared libraries: libMyCalc.so: cannot open shared object file: No such file or directory ldd 命令查询可执行程序执行时候,所依赖的所有动态的库 linux-vdso.so.1 => (0x00007fffa3cbd000) libMyCalc.so => not found libc.so.6 => /lib64/libc.so.6 (0x00007fb4182bf000) /lib64/ld-linux-x86-64.so.2 (0x00007fb41868c000) 动态链接器会自动调用动态库 通过lib64/ld-linux-x86-64.so.2加载动态器 根据环境变量去查找动态库
1. 第一种解决办法 不推荐 有可能会跟系统动态库冲突
把我们生成的.so动态库 拷贝到根目录里的lib文件夹中
sudo cp ./lib/libMyCalc.so /lib
2. 第二种解决办法 临时测试用 一般推荐这个
LD_LIBRARY_PATH 搜索动态库时会在搜索系统环境变量前,在这里面找
在系统给我们提供的额外的搜索动态库环境变量,设置了一个当前目录下的lib文件夹,不过这个是临时的,终端关闭在开启就没有了
export LD_LIBRARY_PATH=./lib
./calc 此时文件则不会有任何问题
3. 第三种解决办法 设置永久的 不推荐
cd
vim .bashrc
最后一行加上 重新打开终端 加载./bashrc
export LD_LIBRARY_PATH=/home/用户名/Calc/lib
4. 第四种方法
1. 需要找动态链接器的配置文件
2. 动态库的路径写到配置文件中
3. 更新 -- sudo ldconfig -v
cd /etc
ls -l ld.so.conf
sudo vim ld.so.conf
sudo ldconfig -v
动态库的优缺点
优点
- 执行程序体积小
动态库更新了,不需要重新编译程序
- 函数接口不变
缺点
- 发布程序的时候,需要将动态库提供给用户
- 动态库没有被打包到应用程序中,加载速度相对较慢