1. 优缺点
1.1 静态库
静态库优点:因为已经加载到app当中去,所以加载速度较快,优于动态库。
静态库缺点:程序主体占用较大,且不方便更新维护,更新需将整个程序编译更换。
1.2 动态库
动态库优点:程序主体占用较小,方便更新维护,更新只需将新动态库编译更换即可。
动态库缺点:所以加载速度较慢,劣于静态库。
2. 库的制作及使用
2.1 静态库的命名规则
静态库的文件命名方式为“libxxxx.a”,库名前加“ lib ”,后缀为“ .a ”,“xxxx”为静态库名。
2.2 静态库制作步骤
原材料:源代码.c或.cpp
将 .c文件生成 .o
gcc a.c b.c -c
将 .o文件打包
ar rcs 静态库的名字 原材料
ar rcs libtest.a a.o b.o
2.3 静态库的使用
-l是指定静态库,加上库名xxx ,-L 是告诉编译器从哪里开始寻找库,默认从/usr/lib/ 或/usr/local/lib/下去找。
gcc main.c -ltest -L ./
2.4 动态库的命名规则
动态库的命名方式与静态库类似,前缀相同,为“ lib ”,后缀变为“ .so ”。所以为“ libtest.so”。
2.5 动态库制作步骤
-fpic 生成与位置无关的代码,用于编译阶段
-shared 指定生成动态库
直接一步生成:gcc -shared -fpic test.c -o libtest.so
2.6 动态库的使用
gcc main.c -ltest -L ./,跟静态库用法相同。
但注意,动态库没有编译到主程序里,而是每次默认从/usr/lib 下调用动态库,那么需要自己引用动态库。
方法一:修改LD_LIBRARY_PATH环境变量
特点:这种方法主要处理临时的动态库加载,LD_LIBRARY_PATH环境变量修改后,只能是对当前的用户生效。
LD_LIBRARY_PATH的作用:这个环境变量用于在程序加载运行期间查找动态链接库时指定除了系统默认路径之外的其他路径,注意,LD_LIBRARY_PATH中指定的路径会在系统默认路径之前进行查找。
具体步骤:
1、找到动态库所在路径:sudo find / -name “[动态库名字]”
2、打开~/.bashrc文件
3、在该文件最后一趟添加:export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:[动态库所在的绝对路径]
4、source ~/.bashrc
方法二:修改/etc/ld.so.conf配置文件
特点:对所有用户生效。不是每个操作系统都有这个配置文件,就Ubuntu系统有。
/etc/ld.so.conf的作用:记录了程序加载运行期间查找动态链接库时的路径。
具体步骤:
1、找到动态库所在路径:sudo find / -name “[动态库名字]”
2、打开/etc/ld.so.conf文件:sudo vi /etc/ld.so.conf
3、在最后一行添加动态库的绝对路径
4、重新加载/etc/ld.so.conf文件:sudo ldconfig -v
可参考这篇文章如何调用动态库。
如上配置环境变量可配合shell脚本使用,需加可执行权限。如chmod +x test.sh
。