采用dlopen、dlsym、dlclose加载动态链接库
来源:互联网 发布:什么软件画平面图 编辑:程序博客网 时间:2024/05/29 03:16
1、前言
为了使程序方便扩展,具备通用性,可以采用插件形式。采用异步事件驱动模型,保证主程序逻辑不变,将各个业务已动态链接库的形式加载进来,这就是所谓的插件。linux提供了加载和处理动态链接库的系统调用,非常方便。本文先从使用上进行总结,涉及到基本的操作方法,关于动态链接库的本质及如何加载进来,需要进一步学习,后续继续补充。如何将程序设计为插件形式,挖掘出主题和业务之间的关系,需要进一步去学习。
2、生产动态链接库
编译参数 gcc -fPIC -shared
例如将如下程序编译为动态链接库libcaculate.so,程序如下:
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){ return (a / b);}
编译如下: gcc -fPIC -shared caculate.c -o libcaculate.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 立即决定,返回前解除所有未决定的符号。
采用上面生成的libcaculate.so,写个测试程序如下:
#include <stdio.h> #include <stdlib.h> #include <dlfcn.h> //动态链接库路径 #define LIB_CACULATE_PATH "./libcaculate.so" //函数指针 typedef int (*CAC_FUNC)(int, int); int main() { void *handle; char *error; CAC_FUNC cac_func = NULL; //打开动态链接库 handle = dlopen(LIB_CACULATE_PATH, RTLD_LAZY); if (!handle) { fprintf(stderr, "%s\n", dlerror()); exit(EXIT_FAILURE); } //清除之前存在的错误 dlerror(); //获取一个函数 *(void **) (&cac_func) = dlsym(handle, "add"); if ((error = dlerror()) != NULL) { fprintf(stderr, "%s\n", error); exit(EXIT_FAILURE); } printf("add: %d\n", (*cac_func)(2,7)); cac_func = (CAC_FUNC)dlsym(handle, "sub"); printf("sub: %d\n", cac_func(9,2)); cac_func = (CAC_FUNC)dlsym(handle, "mul"); printf("mul: %d\n", cac_func(3,2)); cac_func = (CAC_FUNC)dlsym(handle, "div"); printf("div: %d\n", cac_func(8,2)); //关闭动态链接库 dlclose(handle); exit(EXIT_SUCCESS); }
编译选项如下:gcc -rdynamic -o main main.c -ldl
测试结果如下所示:
参考资料:
http://blog.chinaunix.net/uid-26285146-id-3262288.html
http://www.360doc.com/content/10/1213/22/4947005_77867631.shtml
原文地址:http://www.cnblogs.com/Anker/p/3746802.html
- 采用dlopen、dlsym、dlclose加载动态链接库【总结】
- 采用dlopen、dlsym、dlclose加载动态链接库【总结】
- 采用dlopen、dlsym、dlclose加载动态链接库【总结】
- 采用dlopen、dlsym、dlclose加载动态链接库
- 采用dlopen、dlsym、dlclose加载动态链接库
- 采用dlopen、dlsym、dlclose加载动态链接库【总结】
- 采用dlopen、dlsym、dlclose加载动态链接库【总结】
- 采用dlopen、dlsym、dlclose加载动态链接库
- 采用dlopen、dlsym、dlclose加载动态链接库
- 采用dlopen、dlsym、dlclose加载动态链接库【总结】
- 采用dlopen、dlsym、dlclose加载动态链接库【总结】
- 采用dlopen、dlsym、dlclose加载动态链接库
- 采用dlopen,dlsym,dlclose 加载动态链接库
- 采用dlopen、dlsym、dlclose加载动态链接库【总结】
- 采用dlopen、dlsym、dlclose加载动态链接库【总结】
- 采用dlopen、dlsym、dlclose加载动态链接库
- 采用dlopen、dlsym、dlclose加载动态链接库
- 采用dlopen、dlsym、dlclose加载动态链接库【总结】
- EventBus基础教程解析,一分钟学会EventBus的使用
- Linux查看开机运行时间的多种方法
- 正则化方法:L1和L2 regularization、数据集扩增、dropout
- swift-tableView 代理方法实现点击按钮删除效果
- Java 获取用户请求ip
- 采用dlopen、dlsym、dlclose加载动态链接库
- easyui combotree 异步加载节点 默认值 问题
- 开发积累
- CSS布局奇淫技巧之-高度自适应
- apt-get install时遇到 Sub-process /usr/bin/dpkg returned an error code (1)
- 【证明】加减法交换两个整数,过程可能会溢出,但结果依然正确
- 建立Android5.1.1编译环境
- 在CMD下用java命令出现“找不到或无法加载主类”问题
- 秒杀多线程第一篇 多线程笔试面试题汇总