采用dlopen、dlsym、dlclose加载动态链接库
1、前言
为了使程序方便扩展,具备通用性,可以采用插件形式。采用异步事件驱动模型,保证主程序逻辑不变,将各个业务已动态链接库的形式加载进来,这就是所谓的插件。linux提供了加载和处理动态链接库的系统调用,非常方便。本文先从使用上进行总结,涉及到基本的操作方法,关于动态链接库的本质及如何加载进来,需要进一步学习,后续继续补充。如何将程序设计为插件形式,挖掘出主题和业务之间的关系,需要进一步去学习。
2、生产动态链接库
注意:这里的编译指令无法编译Cpp文件
例如将如下程序编译为动态链接库test.c,程序如下:
#include <stdio.h>
#include <unistd.h>
int add(int a,int b){return (a + b);
}
int sub(int a,int b){return (a - b);
}
int mul(int a,int b){return (a * b);
}
int div(int a,int b){if(b != 0){return (a / b);}
}
编译如下:
gcc -fPIC -shared test.c -o test.so
3、dlopen、dlsym函数介绍
在linux上man dlopen可以看到使用说明,函数声明如下:
#include <dlfcn.h>
void *dlopen(const char *filename, int flag);
char *dlerror(void);
void *dlsym(void *handle, const char *symbol);
int dlclose(void *handle);
dlopen以指定模式打开指定的动态连接库文件,并返回一个句柄给调用进程,
dlerror返回出现的错误,
dlsym通过句柄和连接符名称获取函数名或者变量名,
dlclose来卸载打开的库。
dlopen打开模式如下:
RTLD_LAZY 暂缓决定,等有需要时再解出符号
RTLD_NOW 立即决定,返回前解除所有未决定的符号。
采用上面生成的test.so,创建main.c文件,写个测试程序如下:
#include <stdio.h>
#include <stdlib.h>
//依赖的头文件
#include <dlfcn.h>
//动态链接库路径
#define LIB_TEST_PATH "./test.so"
//声明函数指针
typedef int(*CAC_FUNC)(int,int);
int main(){void *handle;char *error;CAC_FUNC cac_func = NULL;//打开动态链接库handle = dlopen(LIB_TEST_PATH,RTLD_LAZY);if(!handle){printf("handle is null!\n");return -1;}//清除之前存在的错误char* szerror = dlerror();if(szerror != NULL){printf("error message:%s\n",szerror);dlclose(handle);return -1;}//获取一个函数cac_func =(CAC_FUNC)dlsym(handle,"add");if(cac_func != NULL){int num = cac_func(5,5);printf("add_num:%d\n",num);}cac_func = (CAC_FUNC)dlsym(handle,"sub");if(cac_func != NULL){int num = cac_func(6,5);printf("cac_num:%d\n",num);}cac_func = (CAC_FUNC)dlsym(handle,"mul");if(cac_func != NULL){int num = cac_func(5,5);printf("mul_num:%d\n",num);}cac_func = (CAC_FUNC)dlsym(handle,"div");if(cac_func != NULL) {int num = cac_func(6,2);printf("div_num:%d\n",num);}//关闭动态链接库dlclose(handle);cac_func = NULL;return 0;
}
编译选项如下:
gcc -rdynamic -o main main.c -ldl
测试结果如下所示:
采用dlopen、dlsym、dlclose加载动态链接库相关推荐
- dlopen dlsym dlclose加载动态链接库
dlopen 在dlopen()函数以指定模式打开指定的动态链接库文件,并返回一个句柄给dlsym()的调用进程.使用dlclose()来卸载打开的库. 基本定义 功能:打开一个动态链接库,并返回动态 ...
- linux dlopen 源码,采用dlopen、dlsym、dlclose加载动态链接库
采用dlopen.dlsym.dlclose加载动态链接库 转载请标注,熬夜写的文章,挺辛苦 ... 环境 系统: 16.04.1-Ubuntu 编译器: gnu 5.4.0 python: 2.7. ...
- 【转】采用dlopen、dlsym、dlclose加载动态链接库
1.前言 为了使程序方便扩展,具备通用性,可以采用插件形式.采用异步事件驱动模型,保证主控制逻辑不变,将各个业务以动态链接库的形式加载进来,这就是所谓的插件.linux提供了加载和处理动态链接库的系统 ...
- 采用dlopen、dlsym、dlclose加载动态链接库【总结】
1.前言 为了使程序方便扩展,具备通用性,可以采用插件形式.采用异步事件驱动模型,保证主程序逻辑不变,将各个业务已动态链接库的形式加载进来,这就是所谓的插件.linux提供了加载和处理动态链接库的系统 ...
- dlsym 如何查看一个so里面的_用dlopen,dlsym加载动态链接库.so中函数
代码如下 static void *findSymbol(const char *path, const char *symbol) { void *handle = dlopen(path, RTL ...
- 采用dlopen、dlsym、dlclose dlopen dlerror加载动态链接库【总结】
1.前言为了使程序方便扩展,具备通用性,可以采用插件形式.采用异步事件驱动模型,保证主程序逻辑不变,将各个业务已动态链接库的形式加载进来,这就是所谓的插件.linux提供了加载和处理动态链接库的系统调 ...
- LINUX下动态链接库的使用-dlopen dlsym dlclose dlerror
dlopen 基本定义 功能:打开一个动态链接库 包含头文件: #include <dlfcn.h> 函数定义: void * dlopen( const char * pathn ...
- LINUX下动态链接库的使用-dlopen dlsym dlclose dlerror【zt】
dlopen 基本定义 功能:打开一个动态链接库 包含头文件: #include <dlfcn.h> 函数定义: void * dlopen( const char * pathname, ...
- LINUX下动态链接库的使用(dlopen/dlsym/dlclose/dlerror)
dlopen 功能:打开一个动态链接库 包含头文件: #include <dlfcn.h> 函数定义: void * dlopen( const char * pathname, in ...
最新文章
- 为什么数学家、统计学家和机器学习专家会用不同方式解决问题?
- 火狐放不了html5 video MP4格式
- 【线性规划和网络流24题】
- 作业32-完成评论功能
- 整数阶贝塞尔函数c语言,整数阶复宗量变形贝塞尔函数的计算.pdf
- 转:Hash, MAC,HMAC说明
- 群晖备份linux分区,数据丢失的后悔药,群晖NAS备份方案详解
- matlab db(X R),matlab操作sqlite数据库
- 狸猫换太子--删除无头单链表中结点
- VS2012+SQLServer2008 R2 开发工具
- python函数参数顺序_对Python中函数参数类型及排序问题,三个方面的总结
- ESD二极管,SOT-23封装型号大全
- linux 查看网卡厂商,linux下查看网卡信息的命令
- Python人脸检测实战之疲劳检测
- 探索第二个合数世纪C语言,第一单元 探索计算机的奥秘
- MatLab 计算开根号
- 2.8 复习 定语从句 将来进行时 将来完成时
- Java初转型-Maven入门
- Newstart HA进阶
- 移动安全办公的难点在哪?