解决qt4.8中tst_qwebpage/tst_qwebview/tst_qwebframe/webcore(QtWebKit4.dll)模块编译失败问题
来源:互联网 发布:if while流程图软件 编辑:程序博客网 时间:2024/06/05 19:58
延续上一篇博客:
qt4.8.7 源码在win7+vs2010环境的x64编译(qt 64位)
http://blog.csdn.net/feichizhongwu888/article/details/48969481
笔者上一份博客,由于时间关系,对qt4.8在windows+MSVC下的编译,留下了几个bug还没有解决。经过比较排除,主要集中在以下几个工程编译有问题:tst_qwebpage/tst_qwebview/tst_qwebframe/webcore(QtWebKit4.dll)。其中webcore即将生成QtWebKit4.dll,少了QtWebKit4.dll很多qt的工具都没法使用,比如designer.exe。
BUG1:
tst_qwebpage/tst_qwebview/tst_qwebframe:
以上三个工程属于同一种解决方法。
首先,按照提示,定位到问题所在行2682,如下图
根据vs2010红线提示功能,你会发现TEST_SOURCE_DIR提示有问题。鼠标放在所有变量,会提示一个路径。实际上这个路径就是qwebpage/qwebview/qwebframe的源码路径。TEST_SOURCE_DIR宏在这里无法识别,所以,只要在每一个出问题源文件人工定义该宏值,就可以handle这个bug。我电脑的该路径为E:\Libraries\qt4\src\3rdparty\webkit\Source\WebKit\qt\tests\
在头文件定义下面加入宏定义为:
#include <qwebsecurityorigin.h>#include <qwebview.h>#include <qimagewriter.h>#define TESTS_SOURCE_DIR "E:/Libraries/qt4/src/3rdparty/webkit/Source/WebKit/qt/tests/"重新Build Solution,就可以解决这个问题了。
Bug2:
错误 234 error LNK2019: 无法解析的外部符号 _HBeginPaint,该符号在函数 "private: static struct HDC__ * __cdeclWebCore::PluginView::hookedBeginPaint(struct HWND__ *,struct tagPAINTSTRUCT *)" (?hookedBeginPaint@PluginView@WebCore@@CAPEAUHDC__@@PEAUHWND__@@PEAUtagPAINTSTRUCT@@@Z) 中被引用E:\Libraries\qt4\src\3rdparty\webkit\Source\WebKit\qt\webcore.lib(PluginViewWin.obj)QtWebKit
错误 235 error LNK2019: 无法解析的外部符号 _HEndPaint,该符号在函数 "private: static int __cdeclWebCore::PluginView::hookedEndPaint(struct HWND__ *,struct tagPAINTSTRUCT const *)" (?hookedEndPaint@PluginView@WebCore@@CAHPEAUHWND__@@PEBUtagPAINTSTRUCT@@@Z) 中被引用E:\Libraries\qt4\src\3rdparty\webkit\Source\WebKit\qt\webcore.lib(PluginViewWin.obj)QtWebKit
通过Find Solution,你会找到hookedBeginPaint的定义在webcore--->PluginViewWin.cpp中。出问题代码如下:
如上图,打钩地方_HBeginPaint函数是一个无法解析外部符号,其实本质原因无非就是_HBeginPaint定义代码,没有加载进入工程当中。这是为什么呢???
从本源文件开头,有_HBeginPaint的定义,你会发现这是一种c++调用汇编代码方式。
#if OS(WINDOWS) && CPU(X86_64) && COMPILER(MSVC)extern "C" HDC __stdcall _HBeginPaint(HWND hWnd, LPPAINTSTRUCT lpPaint);extern "C" BOOL __stdcall _HEndPaint(HWND hWnd, const PAINTSTRUCT* lpPaint);#endif验证想法的是,在PluginViewWin.cpp同目录下,有一个汇编文件PaintHooks.asm,使用普通记事本打开,你会发现,里面就是定义了_HBeginPaint函数。
PaintHooks.asm里面内容为:
到这里我们就可以下一个结论了,对于vs2010为什么会报无法解析外部符号_HBeginPaint。原因,就是vs2010采用c++编译器,是无法编译汇编语言的。所以需要设置汇编编译器,单独编译PaintHooks.asm文件,成为二进制文件PaintHooks.obj。
找出问题所在之后,只要我们让vs2010能编译汇编语言就行了。
这部分我参考了一个博客:
VS2010配置MASM完成汇编代码编译
http://blog.csdn.net/natepan/article/details/6781439
就这问题,笔者重新罗列一下步骤:
1.选中webcore这个工程,右键---》添加----》现有项,将PaintHooks.asm加入到工程当中,在Source Files分类中,可以找到这个文件。
2.选中webcore这个工程,右键---》生成自定义----》勾选“masm(.targets .props)”选项---》确定
3.在Source Files分类中,可以找到PaintHooks.asm,选中,右键---》属性--》在“常规”选项卡中,对“项类型”选择“Microsoft Macro assembler”--》确定。
4.选中PaintHooks.asm,右键----》编译,在.\src\3rdparty\webkit\Source\WebCore\tmp\obj\release_shared目录下,就会生成PaintHooks.obj二进制文件,这个文件就可以被c
++代码直接调用,具体调用回到前面所述c++调用汇编函数代码。
5.Build Solution,就彻底解决问题了。
到此,qt4.8在windows7+vs2010+x64+release的编译就彻底结束,所有库都可以编程成功。No errors!!!
- 解决qt4.8中tst_qwebpage/tst_qwebview/tst_qwebframe/webcore(QtWebKit4.dll)模块编译失败问题
- 解决eclipse中maven项目编译失败的问题
- Qt 使用QAxtiveX 模块编译异常问题 Qt4.8.0
- 解决QT4中中文显示乱码问题
- Qt4.8.1中 没有找到mingwm10.dll 完美解决
- Qt4.8.1中 没有找到mingwm10.dll 完美解决
- Qt4.8.1中 没有找到mingwm10.dll 完美解决
- How to Fix QtWebKit4.dll DLL Error
- How to Fix QtWebKit4.dll DLL Error
- 关于Unity3D中WebCore插件的问题
- 关于Unity3D中WebCore插件的问题
- How to Completely Fix qtwebkit4.dll Error
- DLL中使用FindResource失败的问题
- maven分布式开发解决编译失败问题
- 移植WebCore模块
- Windows Webcore 编译出错
- 解决jdk1.8中发送邮件失败(handshake_failure)问题
- 解决jdk1.8中发送邮件失败(handshake_failure)问题
- 微信 签名 和 Openid的官方解释
- meteor weixin 开发中的坑
- JavaScript原型继承工作原理
- JDK自带的缓存--包装类的缓存
- (六)事务的提交与回滚极死锁检测、处理和预防
- 解决qt4.8中tst_qwebpage/tst_qwebview/tst_qwebframe/webcore(QtWebKit4.dll)模块编译失败问题
- Xml字符串和Java对象转换利器——XStream
- for,foreach,iterator的用法和区别
- odbc 驱动 windows10 安装
- unity3d点击屏幕判断是否击中场景中物体
- Java与数据库的连接
- APN客制化
- 接触git,初学git命令记录一下
- Linux资源控制-CPU和内存