我也找不到合适的列子。我直接上代码吧。通过输入不同的so或者dll执行不同的内容。本文件以Unix/Linux中的C语言代码为例子。使用到的知识很简单。就是dlopen和dlsym函数。所有的函数都在dlfcn.h头文件中。
[cpp]
view plain
copy
- 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>
[cpp]
view plain
copy
- dlsym(void *dp, char * funtionname);
- dp:已经打开的so或者dll文件句柄
- functionname:要解析的文件名字
- 数返回值是void*,指向函数的地址
[cpp]
view plain
copy
- dlclose(void *dp)
- 关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才会真正被系统卸载。
主函数
[cpp]
view plain
copy
- #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);
[cpp]
view plain
copy
- #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
[cpp]
view plain
copy
- #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 头文件
[cpp]
view plain
copy
- typedef struct dll{
- char * name;
- void (*done)() ;
- }dll;
以下为gcc的编译过程
[cpp]
view plain
copy
- 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