LINUX 下动态链接库的使用-dlopen dlsym dlclose dlerror(转)
1. 打开动态链接库:
#include <dlfcn.h>
void *dlopen(const char *filename, int flag);
该函数返回操作句柄,如:
void *pHandle = dlopen(strSoFilePath, RTLD_LAZY);
2. 取动态对象地址:
#include <dlfcn.h>
void *dlsym(void *pHandle, char *symbol);
dlsym 根据动态链接库操作句柄(pHandle)与符号(symbol),返回符号对
应的地址。使用这个函数不但可以获取函数地址,也可以获取变量地址。
比如,假设在 so 中定义了一个 void mytest()函数,那在使用 so 时先声
明一个函数指针:void (*pMytest)(),然后使用 dlsym 函数将函数指针
pMytest 指向 mytest 函数:
pMytest = (void (*)())dlsym(pHandle, "mytest");
3. 关闭动态链接库:
#include <dlfcn.h>
int dlclose(void *handle);
该函数将该.so 的引用计数减一,当引用计数为 0 时,将它从系统中卸
载。
4. 动态库错误函数:
#include <dlfcn.h>
const char *dlerror(void);
当动态链接库操作函数执行失败时,dlerror 可以返回出错信息,返回
值为 NULL 时 表示没有错误信息。
在取到函数执行地址后,就可以在动态库的使用程序里根据动态库提供
的函数接口调用动态库里的函数。
在编写调用动态库的程序的 Makefile 文件时,需要加入编译选项-ldl。
从 void *dlsym(void *handle, char *symbol); 的参数可以看出,该函
数只传两个参数:一个指向 so 的 handle 和一个函数的 symbol,所以
so 里面的函数应该不允许重载, 否则根据一个 symbol 不能确定指向