程序中动态加载共享库
前提:本文是基于Linux系统下的编程与学习
动态加载,按需加载,工程师需要动态库的时候,才将动态库加载到内存。
dlopen(3)
#include <dlfcn.h>
void *dlopen(const char *filename, int flags);
功能:打开一个共享库文件,返回一个handle。指向了打开的共享库对象
filename:"字符串" 指定了共享库的文件名字
flags:
RTLD_LAZY:懒加载 只适用于函数。只有在函数被执行的时候,才确定函数的地址。函数不执行,不加载。
RTLD_NOW:立即加载 在dlopen返回之前,动态库的符号就已经确定了地址
返回值:
NULL 代表函数执行失败
dlcose(3)
int dlclose(void *handle);
功能:关闭共享库,共享库的引用计数减一,如果引用计数为0.系统卸载该共享库。
handle:共享库加载到内存的地址
返回值:
成功 0
错误 非0的错误值
dlerror(3)
#include <dlfcn.h>
char *dlerror(void);
功能:获取dlopen API函数调用产生的错误信息
参数:void
描述错误信息的字符串
dlsym(3)
#include <dlfcn.h>
void *dlsym(void *handle, const char *symbol);
功能:获取共享库中symbol的地址
handle:指定共享库
symbol:指定要找的符号的名字 函数 全局变量 静态局部变量
返回值:
成功 返回symbol加载到内存的地址
失败 NULL 可以使用dlerror(3)获取错误的原因
参考代码:
1 //动态加载 2 #include <stdio.h> 3 #include <dlfcn.h> 4 5 typedef int (*fun)(int ,int); 6 7 int main(){ 8 //打开共享库文件 9 void* handle=dlopen("libtmath.so",RTLD_NOW); 10 if(handle==NULL){ 11 printf("%s\n",dlerror()); 12 return -1; 13 } 14 //获取需要的函数的入口地址 15 void* p=dlsym(handle,"add"); 16 if(p==NULL){ 17 printf("%s\n",dlerror()); 18 return -1; 19 } 20 fun func; 21 func=(fun)p; 22 printf("%d\n",func(3,5)); 23 //关闭共享库 24 dlclose(handle); 25 return 0; 26 }