共享库
对应于Windows的DLL动态库
共享库的制作
1)命名规则
lib+名字+.so
2)制作步骤
- 生成与位置无关的代码(生成与位置无关的.o -fPIC)
gcc -fpic -c *.c -I../include
- 将.o打包生成共享库(动态库)
gcc -shared -o libMyCalc.so *.o -Iinclude
3)发布和使用共享库
发布lib和include
使用
gcc main.c lib/libMyCalc.so -o app -Iinclude
gcc main.c -Iinclude -L./lib -lMyCalc -o app
gcc main.c -Llib -lmytest -Iinclude -o app
4)解决程序执行时动态库无法被加载问题
①放到系统的库目录中——不允许使用
②临时测试
环境变量:LD_LIBRARY_PATH=将动态库的路径设置给变量
将设置的值,导入到系统环境变量中:export LD_LIBRARY_PATH
当终端关闭,设置会失效
③不常用的方法(永久设置)
在家目录的.bashrc文件 中添加一句话 export LD_LIBRARY_PATH=动态库目录的绝对路径
.bashrc修改完成,需要重启终端
④
需要找动态链接器的配置文件——/etc/ld.so.conf
动态库的路径写到配置文件中——绝对路径
更新—— sudo ldconfig -v
tar zxvf
tar jcvf
应用程序不能执行,动态连接器连接不到自己制作的库
1.临时设置方法
export LD_LIARAY_PATH=./lib
2.永久设置的方法
找到动态链接库的配置文件:/etc/ld.so.conf
在该文件中添加动态库的目录(绝对路径)
更新:sudo ldconfig -v
5)优缺点
有点:
执行程序体积小
动态库更新,不需要重新编译程序(函数接口不变)
缺点:
发布程序的时候,需要将动态库提供给用户
动态库没有被打包到应用程序中,加载速度相对较慢
$ldd app 查询app运行时调用的所有库