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;
}


另外cpp的库在使用这种方式时要用extern “C”声明下,

对于cpp,类可以在函式中作为局部对象调用,如果想使用库中声明的类,则要以返回值的形式来产生了。


 

 

 

 

posted @ 2009-12-14 16:06  平繁  阅读(2283)  评论(3编辑  收藏  举报