Linux静态库(static lib)c语言简单操作
接上一个动态库博客
- 静态库也是库的一种形式,也是一种二进制的封装形式,在静态库做好之后,需要静态库的工程,在编译的时候,会直接把静态库的内容编译进可执行程序中(使用静态库的可执行文件会比使用动态库的可执行文件大),这样这个可执行文件,就可以直接允许,不需要指定库的加载路径
例子:
假如库的源代码为find_max.c find_max.h sort_arry.c sort_arry.h为例
1.编写源代码
2.把源代码分别编译成.o文件
gcc -c find_max.c -o find_max.o
gcc -c sort_arry.c -o sort_arry.o
//可链接文件,包含了这个.c文件本身所有的二进制指令
3.利用ar命令把所有的.o文件打包,生成一个静态库
ar -rc 库的名字 o文件列表
ar -rc libfind_max.a find_max.o
ar -rc libsort_arry.a sort_arry.o
静态库:是以lib开头,以.a结尾
只需要把头文件和库文件拷贝给需要的人即可
4.使用静态库:
gcc main.c -Iinc -lfind_max -lsort_arry.a -L./lib //第一步编译
ldd a.out //第二步查看依赖库文件
linux-vdso.so.1 (0x00007fffa8322000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc9d069f000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc9d0c92000)
使用静态库是把静态库的内容copy到了可执行文件中,所以查看依赖关系的时候不会出现.a库文件的
- 静态库只在编译的时候需要库文件,在运行的时候不需要静态库
静态库和动态库优缺点
静态库:静态库只在编译的时候需要库文件,在运行的时候不需要静态库
编译后就不需要静态库了,不管你的机器中有没有静态库
动态库:
1.静态库明显是冗余的
动态库在系统中,永远只有一份拷贝,不管你有多少个可执行程序用到了这个库,都只有一份,这些可执行程序共享这一份copy
静态库在系统中,有多少个可执行程序,就有多少份copy
2.动态库的更新
只要接口不变,依赖于动态库的程序就不需要重新编译,只需要把更新好的动态库下载到相应的系统中去就可以了,这一点静态库永远做不到。
接口不变:库的名字没变,函数的三要素没变
像游戏的不停服更新就是使用动态库原理。