Chinaunix
标题:
关于共享库的使用
[打印本页]
作者:
流浪着的鱼
时间:
2003-03-21 15:46
标题:
关于共享库的使用
共享库的使用有两种方法:一种是象静态库那样在编译时进行链接;另一种是象DLL一样在运行时动态加载。显然,我们更关心的是后者,因为它应用更加灵活,可以实现插件的功能。要实现共享库的动态加载,必须用到系统提供的一组函数,它们的原型都定义在dlfcn.h中:
1.dlopen 打开共享库
该函数搜索指定的共享库文件,如果该共享库还没有被加载到共享内存中,则加载到共享内存中,并且共享库的总引用数加一;
void *dlopen(const char *path, int mode);
其中,path是共享库的名称,mode是对标示符引用的处理方式,值可为RTLD_LAZY或RTLD_NOW,两者的区别是如果共享库中包含了另外一个共享库的引用,对于RTLD_LAZY模式会运行到引用那里时才会加载另一个共享库,而RTLD_LAZY模式则是加载共享库的时候就会加载另一个共享库。为了提高效率,一般用RTLD_LAZY模式。
该函数返回指向已打开的共享库的句柄指针,供其他函数使用,如果返回NULL表示调用失败。
2.dlsym 获得应用指针
该函数用来获得一个指向函数或数据结构的指针;
void * dlsym(void *handle, const char *symbol);
其中,handle是dlopen函数返回的句柄指针,symbol是函数名或外部数据结构名;
该函数返回指向要获取的函数或数据结构的指针(是(void *)类型,还要经过强制类型转换),如果返回NULL表示该函数或数据结构不存在。
3.dlclose 关闭共享库
该函数关闭已打开的共享库,将共享库的总引用数减一,如果总引用数降为0,则系统会从内存中卸载该共享库并释放资源。
int dlclose(void *handle);
其中,handle是dlopen函数返回的句柄指针;
该函数返回共享库的剩余的总引用数。
4.dlerror 返回错误信息
该函数用来获得dlopen和dlsym调用失败时的具体的错误信息;
const char * dlerror(void);
该函数返回一个字符串指针,指向产生的最后一个错误。
5._init 初始化函数
当dlopen第一次加载共享库时,如果共享库中存在_init()函数,则会自动调用该函数;
void _init(void);
6._fint 析构函数
当dlclose卸载共享库时,如果共享库中存在_fnit()函数,则会自动调用该函数;
void _fnit(void);
使用举例:
myfunc.c(已经编译成libtest.so):
#include <stdio.h>;
int myfunction(void)
{
printf("This is a test!\n");
}
复制代码
mytest.c
#include <stdio.h>;
#include <dlfcn.h>;
int main(void)
{
void *dlh;
int (*func)(void);
dlh = dlopen("libtest.so", RTLD_LAZY);
if (dlh == NULL)
{
printf("Load libtest.so fail, %s\n", dlerror());
exit(1);
}
func = (int (*)(void))dlsym(dlh, "myfunction");
if (func == NULL)
{
printf("Load symbol myfunction fail, %s\n", dlerror());
exit(2);
}
func();
fclose(dlh);
exit(0);
}
复制代码
按如下编译:
对于SCO UNIX: cc -o mytest mytest.c -lc -dy -ldl
对于AIX: cc -o mytest mytest.c -lc
对于Linux: gcc -o mytest mytest.c -lc -ldl
作者:
biandaxia
时间:
2003-06-13 11:15
标题:
关于共享库的使用
1. _fint 析构函数 应为:
_fini
2.fclose改为:
dlclose
作者:
lozity
时间:
2004-05-26 09:28
标题:
关于共享库的使用
看得不是很懂,楼主能不能说明一下共享库有什么作用吗?谢谢
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2