C库的使用——静态库、动态库
- 静态库(调用时与程序整合)
创建或操作静态库——ar
ar [drqtpmmx] [options] archivefile objfile……ar参数archivefile“*.o”
参数及其意义
-r 将objfile文件插入静态库尾或替换静态库中同名文件
-x 从静态库文件中抽取文件object
-t 打印静态库的成员文件列表
-d 从静态库中删除文件objfile
-s 重置静态库文件索引
-v 创建文件冗余信息
-c 创建静态库文件
eg:
ar -rsv libpr.a pr1.o pr2.o //静态库命令规则:lib[name].a
cc -o main mian.c -L./ -lpr或cc -o main main.c ./libpr.a //-L提供静态库目录。
- 动态库(程序执行时才会调用)
Linux和其他使用gcc编译器的Unix设计库命令:
gcc -fpic -c d1.c d2.c //生成*.o文件
gcc -shared -o d1.so d1.o
gcc -shared -o d2.so d2.o
或
gcc -fpic -shared -o d1.so d1.c
gcc -fpic -shared -o d2.so d2.c //某些gcc上可用-G替换-shared
隐式调用:cc -o main mian.c -L./ d1.so //-L 提供动态库目录。
调用后使用与静态库类似。
显式调用:cc -o main main.c -ldl //gcc编译器
#include <dlfcn.h>
Void *dlopen (const char *pathname, int mode); //返回动态库的句柄。
Mode:RTLD_LAZY/动态库的对象符号在被调用时解析;RTLD_NOW/动态库对象的所有符号在函数dlopen返回前被解析。
Void *dlsym(void *handle, const char *name);//在库中搜索函数/变量的名称。
Char *dlerror(void); //获取错误信息,无错返回NULL。2次调用,后一次返回NULL
Int dlclose(void *handle);//动态库使用完必须关闭。
使用时需定义变量。 void*pHandle;//动态库句柄。Void (*pFunc)();//指向函数的指针。Int *p;//变量地址。
总结:
加载静态库就是将库目前的所有内容链接到编译文件中。(编译时即完成)。隐式加载动态库就是编译时将动态库路径、库名加载到代码中,执行时再加载所有库的内容到内存中。显示调用编译时与隐式类似,但是是通过文件代码调用的,通过直接搜索找到并加载相关信息。
动态库的执行时加载的特性赋予了库极大的灵活性,可以实现升级库而不用重新编译代码。