以前总是不明白为什么不同的模块是相互独立的编译,相互之间不存在的调用关系, 怎么做到在使用的时候加载不使用的时候卸载掉? 现在总算是明白了。其实就是将一个功能做成一个动态库,在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文件的方式,可以取以下值RTLD_LAZY:在dlopen返回前,对于动态库中的未定义的符号不执行解析(只对函数引用有效,对于变量引用总是立即解析)。RTLD_NOW: 需要在dlopen返回前,解析出所有未定义符号,如果解析不出来,在dlopen会返回NULL打开错误返回NULL成功,返回库引用.
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\n", dlerror()); exit(1); } init = dlsym(dp, "init");//找到init函数的地址。 init(&p); printf("%s\n", p.name);p.done();//注意这里done虽然是so中函数。却没有使用使用dlsym找done函数的地址。 err = dlerror(); dlclose(dp);}model1.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "dll.h" void done(){ printf("This is test module 1!\n"); } void init(dll *p){ p->name = (char *)calloc(3, sizeof(char)); strcpy(p->name, "so1"); p->done = done; }
model1.c
#include <stdio.h> #include <stdlib.h> #include <string.h> #include "dll.h" void done(){ printf("This is test module 2!\n"); } void init(dll *p){ p->name = (char *)calloc(3, sizeof(char)); strcpy(p->name, "so2"); p->done = done; }
dll.h 头文件
typedef struct dll{ char * name; void (*done)() ; }dll;
以下为gcc的编译过程
gcc -rdynamic -o test test.c dll.h -ldl //-ldl (指定dl库)因为dlopen和dlsym在dl库中 gcc -shared -o module1.so module1.c dll.h gcc -shared -o $module2.so module2.c dll.h
将会根据输入的不同显调用不同的dll中的函数。
.
blog: http://blog.csdn.net/rentiansheng/article/details//8606125
作者:rentiansheng 发表于2013-2-24 0:06:17 原文链接
阅读:139 评论:1 查看评论