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加载动态链接库相关推荐

  1. dlopen dlsym dlclose加载动态链接库

    dlopen 在dlopen()函数以指定模式打开指定的动态链接库文件,并返回一个句柄给dlsym()的调用进程.使用dlclose()来卸载打开的库. 基本定义 功能:打开一个动态链接库,并返回动态 ...

  2. linux dlopen 源码,采用dlopen、dlsym、dlclose加载动态链接库

    采用dlopen.dlsym.dlclose加载动态链接库 转载请标注,熬夜写的文章,挺辛苦 ... 环境 系统: 16.04.1-Ubuntu 编译器: gnu 5.4.0 python: 2.7. ...

  3. 【转】采用dlopen、dlsym、dlclose加载动态链接库

    1.前言 为了使程序方便扩展,具备通用性,可以采用插件形式.采用异步事件驱动模型,保证主控制逻辑不变,将各个业务以动态链接库的形式加载进来,这就是所谓的插件.linux提供了加载和处理动态链接库的系统 ...

  4. 采用dlopen、dlsym、dlclose加载动态链接库【总结】

    1.前言 为了使程序方便扩展,具备通用性,可以采用插件形式.采用异步事件驱动模型,保证主程序逻辑不变,将各个业务已动态链接库的形式加载进来,这就是所谓的插件.linux提供了加载和处理动态链接库的系统 ...

  5. dlsym 如何查看一个so里面的_用dlopen,dlsym加载动态链接库.so中函数

    代码如下 static void *findSymbol(const char *path, const char *symbol) { void *handle = dlopen(path, RTL ...

  6. 采用dlopen、dlsym、dlclose dlopen dlerror加载动态链接库【总结】

    1.前言为了使程序方便扩展,具备通用性,可以采用插件形式.采用异步事件驱动模型,保证主程序逻辑不变,将各个业务已动态链接库的形式加载进来,这就是所谓的插件.linux提供了加载和处理动态链接库的系统调 ...

  7. LINUX下动态链接库的使用-dlopen dlsym dlclose dlerror

    dlopen 基本定义 功能:打开一个动态链接库  包含头文件:  #include <dlfcn.h>  函数定义:  void * dlopen( const char * pathn ...

  8. LINUX下动态链接库的使用-dlopen dlsym dlclose dlerror【zt】

    dlopen 基本定义 功能:打开一个动态链接库 包含头文件: #include <dlfcn.h> 函数定义: void * dlopen( const char * pathname, ...

  9. LINUX下动态链接库的使用(dlopen/dlsym/dlclose/dlerror)

    dlopen 功能:打开一个动态链接库  包含头文件: #include <dlfcn.h>  函数定义: void * dlopen( const char * pathname, in ...

最新文章

  1. 为什么数学家、统计学家和机器学习专家会用不同方式解决问题?
  2. 火狐放不了html5 video MP4格式
  3. 【线性规划和网络流24题】
  4. 作业32-完成评论功能
  5. 整数阶贝塞尔函数c语言,整数阶复宗量变形贝塞尔函数的计算.pdf
  6. 转:Hash, MAC,HMAC说明
  7. 群晖备份linux分区,数据丢失的后悔药,群晖NAS备份方案详解
  8. matlab db(X R),matlab操作sqlite数据库
  9. 狸猫换太子--删除无头单链表中结点
  10. VS2012+SQLServer2008 R2 开发工具
  11. python函数参数顺序_对Python中函数参数类型及排序问题,三个方面的总结
  12. ESD二极管,SOT-23封装型号大全
  13. linux 查看网卡厂商,linux下查看网卡信息的命令
  14. Python人脸检测实战之疲劳检测
  15. 探索第二个合数世纪C语言,第一单元 探索计算机的奥秘
  16. MatLab 计算开根号
  17. 2.8 复习 定语从句 将来进行时 将来完成时
  18. Java初转型-Maven入门
  19. Newstart HA进阶
  20. 移动安全办公的难点在哪?

热门文章

  1. Activity.startManagingCursor方法
  2. CodeForces - 798B Mike and strings
  3. HDU3788 ZOJ问题【文本处理】
  4. HDU6292 赛题分析【水题】
  5. CCF201703-1 分蛋糕(100分)
  6. UVA11192 Group Reverse【水题】
  7. Java 并发 —— 从 BIO 到 NIO
  8. Spring 配置文件
  9. Maven 项目管理 —— 安装与配置
  10. visual studio code(vscode)的使用(快捷键)