一、创建共享库:
1.写源程序 xxx1.c xxx2.c.../*.c(通配符方式)
2.编译源程序,加-fpic生成.o文件
gcc -c -fpic xxx1.c xxx2.c.../*.c(通配符方式)
3.生成共享库文件
gcc -shared xxx.o -o libxxx.so
4.提供头文件,方便调用
二、使用共享库
1.写调用源程序 xxx.c
2.编译源程序,生成.o文件
3.链接共享库文件
gcc test.o -l xxx(共享库去掉lib前缀和.a后缀剩下的名字) -L . ----------{PATH}
如果操作系统支持环境变量LIBRARY_PATH,使用该环境变量可以省略-L
4.执行
执行期间,动态加载共享库,系统会自动查找LD_LIBRARY_PATH环境变量中的路径,确定共享库的位置,如果找不到
共享库文件,程序会执行失败。(静态库不需要)
三、显式加载和使用共享库
#include<dlfcn.h>
void *dlopen(const char *filename,int flag);
//filename:so文件名
//flag:打开方式
//返回值:void *,表示打开后的共享库文件指针
char *dlerror(void);
//检查dlopen打开共享库是否成功
//返回空指针表示打开成功
//返回非空字符串表示打开失败,字符串内容包含失败原因
void *dlsym(void *hanlde,const char *symbol);
//使用dlsym获取打开后的共享库中的函数
//hanlde,需要使用的共享库地址,dlopen的返回值
//symbol,需要调用的函数名
//返回值:void *,使用时需要自行转换为对应函数类型
int dlclose(void *handle);
//关闭共享库,释放内存
其中dlopen的参数flag的含义如下:
RTLD_LAZY:符号查找时候才加载。(使用时加载到内存)
RTLD_NOW:马上加载。(打开即加载到内存)