Qt调用跨平台库讲解学习.docx
《Qt调用跨平台库讲解学习.docx》由会员分享,可在线阅读,更多相关《Qt调用跨平台库讲解学习.docx(10页珍藏版)》请在冰豆网上搜索。
Qt调用跨平台库讲解学习
Qt调用跨平台库
您还未登录!
|登录|注册|帮助
CSDN首页资讯论坛博客下载搜索更多CTO俱乐部学生大本营培训充电移动开发软件研发云计算程序员TUP我一路走来---
宁来虎一样的敌人,别来猪一样的战友!
条新通知
登录注册欢迎
退出
我的博客
配置
写文章
文章管理
博客首页
全站当前博客空间博客好友相册留言用户操作
[留言][发消息][加为好友]
tingsking18ID:
tingsking18
此用户是CSDN博客专家
如何成为专家?
共1425196次访问,排名28,好友274人,关注者235人。
tingsking18的文章
原创126篇
翻译0篇
转载48篇
评论238篇
订阅我的博客
[编辑]tingsking18的公告
鸽写的不是代码,是寂寞~!
[编辑]文章分类
asp、
C#
C/C++
C++Builder
C++库
Delphi
JAVA
JavaScript
linux&unix
Meego
python
QT
VC
WCF
windows编程
面向对象和UML
数据库
杂乱情感
正则表达式
中间件
[编辑]我的好友
C++GUIProgrammingwithQt4
FocusOnACE
Kevins的天空
lijiji_1515
OSX书籍(RSS)
OSX资源(RSS)
pimshell
psdk
zhaoyihui888
张硕(CathyEagle)
暗金装备
杨德龙的专栏(RSS)
王中王的Blog
王立卫
编程手札
马说
存档
2010年08月
(1)
2010年06月(4)
2010年05月
(1)
2010年04月(10)
2010年03月(3)
2010年02月
(1)
2010年01月(8)
2009年12月(17)
2009年11月(18)
2009年10月
(2)
2009年09月(6)
2009年08月(8)
2009年07月(8)
2009年06月
(2)
2009年05月(8)
2009年04月(5)
2009年03月(14)
2007年08月
(1)
2007年04月
(1)
2007年03月(3)
2007年02月(3)
2007年01月
(2)
2006年11月
(1)
2006年10月
(1)
2006年09月
(1)
2006年08月
(2)
2006年07月
(2)
2006年06月
(1)
2006年05月(4)
2006年04月(5)
2006年03月(11)
2006年02月(20)
公告:
第三届中国云计算大会7.5折票价抢购中!
[意见反馈][官方博客]QT源码解析(五)QLibrary跨平台调用动态库的实现收藏此文于2010-01-04被推荐到CSDN首页
如何被推荐?
版权声明
请尊重原创作品。
转载请保持文章完整性,并以超链接形式注明原始作者“tingsking18”和主站点地址,方便其他朋友提问和指正。
QT源码解析
(一)QT创建窗口程序、消息循环和WinMain函数
QT源码解析
(二)深入剖析QT元对象系统和信号槽机制
QT源码解析(三)深入剖析QT元对象系统和信号槽机制(续)
QT源码解析(四)剖析Qt的事件机制原理
QT源码解析(五)QLibrary跨平台调用动态库的实现
QT源码解析(六)Qt信号槽机制与事件机制的联系
QT源码解析(七)Qt创建窗体的过程
QT源码解析(八)Qt是如何处理windows消息的
QT源码解析(九)解析QDateTime
1)win下动态库调用有关的函数包括:
(1)LoadLibrary,装载动态库。
(2)GetProcAddress,获取要引入的函数,将符号名或标识号转换为DLL内部地址。
(3)FreeLibrary,释放动态链接库。
2)unix上与动态库调用有关的函数包括:
(1)_打开动态链接库:
dlopen,函数原型void*dlopen(constchar*filename,intflag);
dlopen用于打开指定名字(filename)的动态链接库,并返回操作句柄。
(2)取函数执行地址:
dlsym,函数原型为:
void*dlsym(void*handle,char*symbol);
dlsym根据动态链接库操作句柄(handle)与符号(symbol),返回符号对应的函数的执行代码地址。
(3)关闭动态链接库:
dlclose,函数原型为:
intdlclose(void*handle);
dlclose用于关闭指定句柄的动态链接库,只有当此动态链接库的使用计数为0时,才会真正被系统卸载。
(4)动态库错误函数:
dlerror,函数原型为:
constchar*dlerror(void);当动态链接库操作函数执行失败时,dlerror可以返回出错信息,返回值为NULL时表示操作函数执行成功。
我们来分析下Qt的源代码,看看Qt是如何封装这两种不同的调用动态库的方法。
下面是我用vc编写的一个动态库中的函数add:
extern"C"__declspec(dllexport)int__stdcalladd(inta,intb)
{
returna+b;
}
下面我就用QLibrary来调用一下:
QLibrarylib("QtDllTest.dll");
if(lib.load())
{
typedefint(*AddFunction)(inta,intb);
AddFunctionAdd=(AddFunction)lib.resolve("add");
if(!
Add)
{
cout<<"failed"<}
else
{
intm;
m=Add(1,1);//来个计算1+1
cout<<"result:
"<}
lib.unload();
}
else
{
cout<<"failed"<}
首先将目录切换到QTDIR\src\corelib\plugin,这里面就是QLibrary实现的源代码,打开qlibrary_p.h(熟悉了Qt的常用手法,就知道,这就是QLibrary内部实现的代码),可以看到
boolload_sys();
boolunload_sys();
void*resolve_sys(constchar*);
三个函数。
在qlibrary.cpp中可以找到调用这三个函数的地方
boolQLibrary:
:
load()调用了load_sys;
boolQLibrary:
:
unload()调用了unload_sys;
void*QLibrary:
:
resolve(constchar*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就是这样实现不同平台动态库的调用。
发表于@2010年01月04日 11:
27:
00|评论
(2)|编辑|举报|收藏
旧一篇:
QT源码解析(四)剖析Qt的事件机制原理|新一篇:
QT源码解析文章索引
-
查看最新精华文章请访问博客首页相关文章
Linux系统共享库编程Linux中动态链接库总结JNI的用法linux动态加载动态链接库dlopenAPI利用LD_PRELOAD给glibc库函数加钩子C标准库函数源代码的实现和分析androidJNI学习笔记1raoyou发表于2010年1月5日10:
41:
50IP:
举报回复删除
mm304321141发表于2010年11月12日14:
33:
13IP:
125.34.47.*举报回复删除
QLibrarylib("QtDllTest.dll");这里不应该有扩展名,Qt会自动处理,毕竟Win和unix下动态库扩展名是不同的。
。
。
发表评论表情:
评论内容:
用户名:
登录注册匿名评论匿名用户验证码:
重新获得验证码
热门招聘职位【诺姆四达EHR】高薪诚聘软件系统工程师、JAVA工程师、数据库工程师、测试工程师【E人E本】热招各类开发人才(Android、java、PHP),更多职位,点击进入【中国知网】高薪诚聘精英技术人才【广东美成达】移民公司诚聘ASP.net程序员【热聘】搜狐畅游全国热招开发工程师【《七雄争霸》研发商:
北京游戏谷】诚聘JAVA、C++技术专家及各类游戏精英【华北计算技术研究所】急聘Java开发、系统架构、需求分析【西安瑞祺科技】诚聘JAVA软件工程师【雅邦网络】诚聘网站项目经理、JAVA技术总监、JAVA开发、网站测试工程师【科锐】诚招IT中高级人才,抢工作机会,赢IPAD啦!
【imo】-国际风投+福利租房+奖金+期权+不加班+调休,邀你共创互联网的奇迹【YOHO!
新力传媒】高薪诚聘各类网站人才北京+南京【诺姆四达EHR】高薪诚聘软件系统工程师、JAVA工程师、数据库工程师、测试工程师【E人E本】热招各类开发人才(Android、java、PHP),更多职位,点击进入【中国知网】高薪诚聘精英技术人才【广东美成达】移民公司诚聘ASP.net程序员【热聘】搜狐畅游全国热招开发工程师【《七雄争霸》研发商:
北京游戏谷】诚聘JAVA、C++技术专家及各类游戏精英【华北计算技术研究所】急聘Java开发、系统架构、需求分析【西安瑞祺科技】诚聘JAVA软件工程师【雅邦网络】诚聘网站项目经理、JAVA技术总监、JAVA开发、网站测试工程师【科锐】诚招IT中高级人才,抢工作机会,赢IPAD啦!
【imo】-国际风投+福利租房+奖金+期权+不加班+调休,邀你共创互联网的奇迹【YOHO!
新力传媒】高薪诚聘各类网站人才北京+南京公司简介|招贤纳士|广告服务|银行汇款帐号|联系方式|版权声明|法律顾问|问题报告
北京创新乐知信息技术有限公司版权所有,京ICP证070598号
世纪乐知(北京)网络技术有限公司提供技术支持
江苏乐知网络技术有限公司提供商务支持
Email:
webmaster@
Copyright©1999-2010,CSDN.NET,AllRightsReserved
近期热点文章推荐1、我的丈夫是个程序员2、使用移动网络的十大真相3、一个简单的C#多线程间同步例子4、2010年五大浮夸科技产品5、如果让马云演《终结者5》,会是什么样?
6、Apple固步自封,还是老谋深算?
7、多样的需求,多样的IT8、移动应用开发者调查报告热聘搜狐畅游全国热招开发工程师
本文来自CSDN博客,转载请标明出处: