Qt中加载动态库

unix上与动态库调用有关的函数包括

    (1)_打开动态链接库:dlopen,函数原型void *dlopen (const char *filename, int flag); dlopen用于打开指定名字(filename)的动态链接库,并返回操作句柄。
    (2)取函数执行地址:dlsym,函数原型为: void *dlsym(void *handle, char *symbol); dlsym根据动态链接库操作句柄(handle)与符号(symbol),返回符号对应的函数的执行代码地址。
    (3)关闭动态链接库:dlclose,函数原型为: int dlclose (void *handle); dlclose用于关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才会真正被系统卸载。
    (4)动态库错误函数:dlerror,函数原型为: const char *dlerror(void); 当动态链接库操作函数执行失败时,dlerror可以返回出错信息,返回值为NULL时表示操作函数执行成功。
	QLibrary lib("XXXXXX.so");
if (lib.load())
{    
    typedef int(*MyAdd)(int a,int b);    
    MyAdd Add=(MyAdd)lib.resolve("add");   
    if (!Add)    
    {        
        qDebug() <<"failed"<<endl;   
    }    
    else   
    {      
        int m;       
        m=Add(10, 10);    
        qDebug()<<"result:"<<m<<endl;    
    }    
    lib.unload();
}
else 
{    
    qDebug()<<"failed"<<endl;
}

添加链接描述首先将目录切换到QTDIR/src/corelib/plugin,这里面就是QLibrary实现的源代码,打开qlibrary_p.h(熟悉了Qt的常用手法,就知道,这就是QLibrary内部实现的代码),可以看到
bool load_sys();

bool unload_sys();

void *resolve_sys(const char *);

三个函数。在qlibrary.cpp中可以找到调用这三个函数的地方

bool QLibrary::load ()调用了load_sys;

bool QLibrary::unload ()调用了unload_sys;

void * QLibrary::resolve ( const char * symbol )调用了resolve_sys
但是并没有找到这三个函数的实现,这是这么回事呢?

打开QTDIR/src/corelib/plugin/plugin.pri文件,

win32 { SOURCES += plugin/qlibrary_win.cpp}
unix { SOURCES += plugin/qlibrary_unix.cpp}
原来如此啊。
我们仔细看下qlibrary_win.cpp文件,load_sys函数调用了LoadLibrary,unload_sys调用了FreeLibrary,resolve_sys调用了GetProcAddress。而在qlibrary_unix.cpp文件中,各种linux平台又分好多种。但是基本上load_sys调用了dlopen,unload_sys调用了dlclose,resolve_sys调用了dlsym。在HPUX中dlopen对应shl_load,dlclose对应shl_unload,dlsym对应shl_findsym。
原来QLibrary就是这样实现不同平台动态库的调用.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值