静态库(.a):程序在编译链接的时候把库的代码链接到可执行文件中
动态库(.so):程序在运行的时候才链接动态库中的代码,多个程序共享使用库的代码
静态库的生成(这里以基本运算为例):
1.先创建四个.h .c文件,分别声明和定义加减乘除基本运算函数
2.使用gcc将.c文件生成.o文件,例:gcc -c add.c -o add.o
3.使用命令将四个文件链接起来生成静态库,ar -rc libmylib.a add.o sub.o mul.o div.o
4.使用命令gcc main.c -L . -lmylib 链接静态库并生成可执行文件a.out
- ar:静态库生成链接器
- -r:replace,代表模块替换
- -c:create,代表创建
- 库名规则:lib+库名+.a
- -L:指定库路径
- -l:指定库名
- -t:列出静态库中的文件
- -v:verbose详细信息
库搜索路径:
- 从左到右搜索-L指定的目录
- 由环境变量指定的目录
- 由系统指定的目录:/usr/lib或者/usr/local
删除了静态库之后,a.out仍然可以执行,这也就证明了静态库是在程序编译链接的时候就将库里的代码链接到可执行文件中,也就是将库里的代码拷贝了一份在程序中,这也就造成了空间上的浪费,而且库文件一旦修改或更新了,可执行程序就需要重新编译
动态库的生成:
- shared:表示生成共享库格式
- -fPIC:产生位置无关码
- 库名规则:lib+库名+.so
– l:链接动态库 - -L:链接库所在的路径
1.使用gcc -fPIC -c add.c sub.c mul.c div.c 生成位置无关码
2.使用gcc -shared -o libmylib.so *.o(匹配当前目录下的所有.o文件)生成动态库
3.使用gcc main.c -o main -L . -lmylib链接动态库并生成可执行文件main
删除动态库之后,执行可执行文件main就会报错,这也就说明动态库是程序执行使才链接到库里的代码
运行动态库:
- 拷贝.so文件到系统共享库路径下,一般是/usr/lib
- 更改LD_LIBRARY_PATH
- idconfig配置/etc/id.so.conf.d/,idconfig更新