打开动态链接库
• void *dlopen (const char *filename, int flag);
返回一个操作句柄void *Handle = dlopen (“./libct.so”, RTLD_LAZY);
• RTLD_LAZY:解析动态库遇到未定义符号不退出,仍继续使用
• RTLD_NOW:遇到未定义符号,立即退出
• RTLD_GLOBAL:允许导出符号,后面其它的动态库中可以引用
取动态对象地址
• void *dlsym (void *handle, char *symbol);
根据动态链接库句柄和符号,返回符号对应的地址
一般要定义一个符号类型的指针,保存该符号对应的地址
• void (* funcp) (int , int);
• funcp = (void(*)(int, int )) dlsym(Handle , “myfunc”);
关闭动态链接库
• int dlclose (void *Handle);
该函数将共享库引用计数减一,当引用计数为0时,该共享库
将会从系统中卸载
动态库错误函数
• const chat *dlerror (void);
当动态链接库操作函数失败,dlerror将返回出错信息;没有出
错,则返回值为NULL
系统调用头文件:#include<dlfcn.h>
#include<stdio.h>
#include<stdlib.h>
#include<dlfcn.h>
typedef int (*cac_func)(int ,int);
int main(void)
{
void *handle;
char *error;
cac_func fp = NULL;
handle = dlopen("./libct.so",RTLD_LAZY);
if(!handle)
{
fprintf(stderr, "%s\n", dlerror());
exit(EXIT_FAILURE);
}
dlerror();
fp = dlsym(handle, "add");
if((error = dlerror()) !=NULL)
{
fprintf(stderr, "%s\n",error);
exit(EXIT_FAILURE);
}
printf("add:%d\n",fp(8,2));
fp = (cac_func)dlsym(handle,"sub");
printf("sub:%d\n",fp(8,2));
fp = (cac_func)dlsym(handle,"mul");
printf("mul:%d\n",fp(8,2));
fp = (cac_func)dlsym(handle,"div");
printf("div:%d\n",fp(8,2));
dlclose(handle);
exit(EXIT_SUCCESS);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)