解决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!!!

微笑



0 0
原创粉丝点击