静态库制作
命名格式:
1.以lib开头
2.静态库名
3.a结尾
例如:libsort.a
优点:
- 寻址方便,速度快
- 库被打包到可执行程序中,直接发布可执行程序即可使用
缺点:
- 静态库的代码在编译过程中已经被载入可执行程序,因此体积较大
- 如果静态函数库改变了,那么你的程序必须重新编译
使用场合:
- 在核心程序上使用,保证速度,可忽视空间
- 主流应用于80、90年代,现在很少用
制作
1、得到*.o:gcc a.c b.c c.c -c
2、得到静态库libmytest.a
ar rcs libmytest.a a.o b.o c.o(就是一个打包.o文件的过程)
查看库中的符号(函数、全局变量等):nm libmytest.a
使用静态库
gcc + 源文件 + -L静态库路径 + -l静态库名 + -l头文件目录 + -o 可执行文件名
例如:gcc main.c -L./ -lmytest -l./ -o app
- -L:指定库所在路径
- -l:指定库的名字,去掉前缀lib,去掉后缀.a,只留下中间部分
- -l:头文件目录位置
动态库制作
共享库的代码是在可执行程序运行时才载入内存的,在编译过程中仅简单的引用,因此代码体积较小。
优点:
- 节省内存(共享)
- 易于更新(动态链接):停止运行程序,使用新库覆盖旧库(保证新旧库名称一致,接口一致),重新启动程序
缺点:
- 延时绑定,速度略慢
使用场合:对速度要求不是很强烈的地方都应使用动态库
注意事项:冬天库是否加载到内存,取决于程序是否运行
命名格式:
1.lib开头
2.动态库名
2.so结尾
例如:libmytest.so
制作
1、生成“与位置无关”的目标文件
gcc -fPIC a.c b.c c.c -c
2、制作动态库
gcc -shared -o libmytest.so a.o b.o c.o
-shared:制作动态库
-o:重命名生成的新文件
3、使用动态库
gcc main.c -L./ -lmytest -l./ -o app
-L:指定库所在的路径
去掉前缀lib,去掉后缀so,只留下中间部分
-I:头文件目录位置
4、执行生成的可执行文件
./app可能运行失败原因:
查看依赖的共享库:ldd app,发现libmytest找不到,原因是没有给动态链接器(ld-linux.so.2)制定好动态库libmytest.so的路径
解决方案:
- 临时设置:export LD_LIBRARY_PATH=库路径,将当前目录加入环境变量,但是终端退出了就无效了。
- 永久设置:将上条写入家目录下.bashrc文件中
- 粗暴设置:直接将libmytest.so文件拷贝到/usr/lib/目录下
- 将libmytest.so所在绝对路径追加入到/etc/ld.so.conf文件,使用sudo ldconfig -v更新
LD_LIBRARY_PATH:
作用:指定查找共享库(动态链接库)时除了默认路径之外的其它路径,该路径在默认路径之前查找
设置方法:用export命令来设置值