C语言插件开发模式
作者:网络转载 发布时间:[ 2013/2/26 9:50:48 ] 推荐标签:
以前总是不明白为什么不同的模块是相互独立的编译,相互之间不存在的调用关系, 怎么做到在使用的时候加载不使用的时候卸载掉? 现在总算是明白了。其实是将一个功能做成一个动态库,在window中叫dll,在Unix/Linux中叫做so。通过配置在运行的时候,在运行的时候,通过一些特殊的函数对dll或者so进行操作。找到函数的地址,调用函数。在使用函数的时候找函数,不是使用的时候释放可以了。
我也找不到合适的列子。我直接上代码吧。通过输入不同的so或者dll执行不同的内容。本文件以Unix/Linux中的C语言代码为例子。使用到的知识很简单。是dlopen和dlsym函数。所有的函数都在dlfcn.h头文件中。
void * dlopen( const char * pathname, int mode);
pathname:so或者dll文件的路径,在Linux中必须是以"./"或者"../"开始的相对路径 或者 以"/"开始的路径
mode:解析so或者dll文件的方式,可以取以下值 <DIV class=para>RTLD_LAZY:在dlopen返回前,对于动态库中的未定义的符号不执行解析(只对函数引用有效,对于变量引用总是立即解析)。</DIV><DIV class=para>RTLD_NOW: 需要在dlopen返回前,解析出所有未定义符号,如果解析不出来,在dlopen会返回NULL
<DIV class=para>打开错误返回NULL</DIV><DIV class=para>成功,返回库引用</DIV>.</DIV>
dlsym(void *dp, char * funtionname);
dp:已经打开的so或者dll文件句柄
functionname:要解析的文件名字
数返回值是void*,指向函数的地址
dlclose(void *dp)
关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才会真正被系统卸载。
主函数
#include <stdio.h>
#include <dlfcn.h>
#include "dll.h"
int main(){
void *dp;
char *err;
char fname[20];
dll p;
void (*init)(dll *p);
pirntf("请输入要加载模块的名字:model1 或者model2");
scanf("%s", fname);
sprintf("./%s^, fname);
dp = dlopen(fname, RTLD_LAZY);//打开动态库。
if( NULL == dp) {
printf("%s
", dlerror());
exit(1);
}
init = dlsym(dp, "init");//找到init函数的地址。
init(&p);
printf("%s
", p.name);
相关推荐
更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11