命令规则
lib + 名字 + .so
制作步骤
1)生成与位置无关的代码(生成与位置无关的代码)
2)将.o打包成共享库(动态库)
发布和使用共享库
动态库运行原理:
生成动态库:
gcc -fPIC -c *.c -I ./include
打包动态库并移动
使用动态库:
/*** main.c ***/#include<stdio.h> #include"MyCalc.h"int main() {int a = 10;int b = 20;int result = a + b;printf("a + b = %d\n",result);return 0; }
ubuntu1604@ubuntu:~/wangqinghe/C/sharelib$ gedit main.c
ubuntu1604@ubuntu:~/wangqinghe/C/sharelib$ gcc main.c -Iinclude -L ./lib/ -lMyCalc -o myapp
ubuntu1604@ubuntu:~/wangqinghe/C/sharelib$ ls
app include lib main.c myapp src
ubuntu1604@ubuntu:~/wangqinghe/C/sharelib$ ./myapp
a + b = 30
ldd 命令:查看程序执行时依赖的所有的库
ubuntu1604@ubuntu:~/wangqinghe/C/sharelib$ ldd myapp
linux-vdso.so.1 => (0x00007fffe8d13000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f92ffac7000)
/lib64/ld-linux-x86-64.so.2 (0x00007f92ffe91000)
设置动态库环境变量(临时)
export LD_LIBRARY_PATH=./lib
永久生效:
bansh.rc
将export LD_LIBRARY_PATH=./lib(绝对路径)
解决动态库无法加载
- 需要找到动态链接器的配置文件
- 动态库的路径写到配置文件中
- 更新 sudo idconfig -v
cd etc
ls -l ld.so.conf
vi ld.so.conf
(o 在当前行下行创建一行)
将动态库路径写到该配置文件中(绝对路径)
sudo idconfig -v
动态库的优点:
- 执行程序体积小
- 动态库更新方便(接口没变)
缺点:
- 发布程序时,需要将动态库发布给用户
- 加载速度较静态库较慢