linux下库文件动态加载小例
linux下动态加载库主要使用以下几个函式
void *dlopen(const char *filename, int flag);
void *dlsym(void *handle, const char *symbol);
int dlclose(void *handle);
分别对应了打开,加载和关闭
dlopen中filename为库所在的位置,falg一般最多使用RTLD_LAZY和RTLD_NOW分别对应使用时加载和立即加载
其会返回一个void指针,对应于dlsym中的第一个参数。
dlsym中handle即为dlopen的返回值,symbol以字符串出现,对应库中定义的函式的名称,返回指向该函式的指针
dlclose则应在不用该库时调用,自然是关闭它了。
另外,在使用时要 包含dlfcn.h,并且链接选项要加入-ldl
假设某库中有一个函式声明如下
void println(const char * );
下面给一段超级简单的例子
代码
#include <dlfcn.h>
typedef void (*Func)(const char * );
int main()
{
void * handle;
Func func;
char *tmp="abc";
handle=dlopen("./lib.so",RTLD_LAZY);
if(handle==NULL)
{
perror("oops, handle set abnormal");
}
func=(Func)dlsym(handle,"println");
func(tmp);
dlclose(handle);
return 0;
}
typedef void (*Func)(const char * );
int main()
{
void * handle;
Func func;
char *tmp="abc";
handle=dlopen("./lib.so",RTLD_LAZY);
if(handle==NULL)
{
perror("oops, handle set abnormal");
}
func=(Func)dlsym(handle,"println");
func(tmp);
dlclose(handle);
return 0;
}
另外cpp的库在使用这种方式时要用extern “C”声明下,
对于cpp,类可以在函式中作为局部对象调用,如果想使用库中声明的类,则要以返回值的形式来产生了。