- 论坛徽章:
- 0
|
//say.c
#include stdio.h>
int say(char **str){
printf("%s\n",str);
}
将say.c 生成共享库的编译:
gcc -o dlopen.so -shared say.c
//使用dlopen函数动态加载库的源代码
/**
* Filename: mydlopen.c
* Author: lijunjie
*/
#include stdio.h>
#include dlfcn.h>
#include unistd.h>
void show_help(char *msg){
if(msg == NULL){
printf("Usage:mydlopen dlopen.so say stringtosay\n");
}else{
printf("%s\n",msg);
}
exit(1);
}
int main(int ac,char ** av){
if(ac 3){
show_help(NULL);
}
void *handle;
//void *pfunc;
int (*pfunc)(char *str);
char * filename = av[1];
char * func = av[2];
char * word = av[3];
char * error;
handle = dlopen(filename,RTLD_LAZY);
if(!handle){
printf("Error: handle\n");
return 1;
}
pfunc = (int (*)(char *))dlsym(handle,func);
if((error=dlerror()) != NULL){
printf("Error: dlsym\n");
return 2;
}
(*pfunc)(word);
dlclose(handle);
return 0;
}
//编译命令:
gcc -o mydlopen mydlopen.c -ldl
注意事项:
1.dlsym返回的指针是无类型的,要转换的指定的函数的类型。
2.使用函数指针时的写法: (*pfunc)(word); 不能直接写成 pfunc(word);会段错误的
3.C还不支持默认参数,写show_help时不能给msg以NULL的默认值
3.编译时要使用共享库dl 其中有dlopen dlsynm dlerror dlclose 函数
使用命令:
./mydlopen ./dlopen.so say aaaabbbdddd
本文来自ChinaUnix博客,如果查看原文请点:http://blog.chinaunix.net/u1/53398/showart_468313.html |
|