可以把 多个编译好的目标文件 打包成为一个文件,就是库文件。库文件有两种:静态库(.a)和共享库(.so)。
静态库和共享库区别:
静态库是 函数的归档,在使用时,复制函数的代码区到最终的文件中。
共享库是 函数的归档,在使用时,把函数在共享库中的地址拿到最终的文件中。
静态库的效率稍高一点,但占用空间非常大,而且不利于修改和维护。
共享库的效率稍低一点,但占用空间小,而且修改和维护方便。
一、静态库的创建和使用
1、创建静态库文件(.a)
(1 )写源代码 add.c,保存退出。(2 )编译源程序 add.c,生成目标文件 add.o 。
gcc -c -static add.c
其中-static 可选,可阻止gcc使用共享库。
( 3)打包生成 静态库文件(.a)
ar -r 静态库文件名 add.o
静态库文件名命名规范: lib库名.a
比如:ar -r mystaticlib.a add.o
ar指令:
ar [选项] 归档文件名 目标文件列表
指令ar的常用选项
-d 从归档文件删除指定目标文件列表
-q 从指定目标文件快速附加到归档文件末尾
-r 将指定目标文件插入文档,如果存在则更新
-t 显示目标文件列表
-x 把归档文件展开为目标文件
2、使用静态库:
1 写程序test.c,保存退出。2 编译test.c,生成目标文件test.o。
gcc -c test.c
3 连接库文件的方式:
a 直接连接 gcc test.o mystaticlib.a
b 配置环境变量LIBRARY_PATH,把库文件所在路径加入,运行 gcc test.o -l myku 即可(库名)。
c gcc test.o -l myku -L 库所在路径
注:静态库文件在使用时,必须提供 .h文件。
二、共享库的创建和使用:
1、 共享库的创建(.so)
( 1 )写源程序 add.c,保存退出。(2 )编译源程序,生成目标文件(add.o)。
gcc -c -fpic add.c (-fpic省略也行)
(3 )生成共享库文件。
gcc -shared add.o -o libmyku.so
共享库文件的命名规范: lib库名.so
2、 共享库的使用:
使用方式和静态库一样。注:静态库使用函数时复制代码段,因此静态库在执行时,可执行文件中包含了所有的代码,a.out不再需要静态库。
共享库使用函数时只是留下了函数地址,因此共享库在执行时,可执行文件中只有地址而没有代码,a.out需要在共享库中执行相关函数的代码。环境变量LD_LIBRARY_PATH可以帮助a.out找到共享库。
ldd 可执行文件/库文件名 - 可以查看库文件的关系
三、动态调用共享库
#include <dlfcn.h>void *dlopen(const char *filename, int flag);
打开库文件,filename是带路径的文件名,flag可以为
RTLD_LAZY: 延迟加载(用的时候再把库文件加载到内存)
RTLD_NOW: 马上加载
void *dlsym(void *handle, const char *symbol);
用函数名 从打开的库文件中获取一个函数。
int dlclose(void *handle);
关闭库文件。
char *dlerror(void); //查看是否出错。