打开动态链接库
• 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>
/* C file */
/************************************************
* Copyright(C) zhaixue.cc. All rights reserved
*
* Filename: main.c
* Author: litao.wang
* E-mail: 3284757626@qq.com
* Description:
* Create: 2017-09-21 06:59:57
* Last Modified: 2017-09-21 07:00:08
************************************************/
#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);
}