编译环境:
(1) win7/64
(2) VS2010
(3) qt-everywhere-opensource-src-4.8.6.zip
2.1 开始 -> 所有程序 ->Micorsoft Visual Studio 2010->visual studio tools-> Visual Studio x64 win64 command prompt (2010)
2.2 用cd命令 进入D:\QtLib_4.8.6\qt-everywhere-opensource-src-4.8.6文件夹
2.3 设置如下环境变量:
set QTDIR=D:\QtLib_4.8.6\qt-everywhere-opensource-src-4.8.6
set QMAKESPEC=win32-msvc2010
2.4 修改一些错误:
(1)打开这个文件:<Qt Dir>\src\3rdparty\webkit\Source\WebCore\platform\DefaultLocalizationStrategy.cpp
按Ctrl+G定位 到 327 行, 改为:
return WEB_UI_STRING("Look Up \"<selection>\"", "Look Up context menu item with selected word").replace("<selection>", truncatedStringForLookupMenuItem(selectedString));
注意第一个括号内look up 后的双引号。
(2)--- mkspecs/win32-msvc2010/qmake.conf
+++ mkspecs/win32-msvc2010/qmake.conf
QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO = /DEBUG /OPT:REF
QMAKE_LFLAGS_DEBUG = /DEBUG
修改为
QMAKE_LFLAGS_RELEASE_WITH_DEBUGINFO = /DEBUG /OPT:REF /INCREMENTAL:NOQMAKE_LFLAGS_DEBUG = /DEBUG /INCREMENTAL:NO
2.5 配置编译QT的选项 (可利用configure -hlep命令查看各选项意义,自己选择编译模块)
configure -opensource -nomake demos -nomake examples -platform win32-msvc2010 -webkit
提示:Do you accept the terms of the lisence ? 输入y, 则开始编译qmake工具
2.6 Configure完成后,会在D:\QtLib_4.8.6\qt-everywhere-opensource-src-4.8.6下生成Project.sln,使用VS2010打开后进行release/debug x64 编译
错误 234
error LNK2019: 无法解析的外部符号 _HBeginPaint,该符号在函数 "private: static struct HDC__ * __cdecl
WebCore::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 __cdecl
WebCore::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。
就这问题,笔者重新罗列一下步骤:
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++调用汇编函数代码。
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/"
重新编译,就可以解决这个问题了。
安装QT Addin 1.1.11插件
插件也是什么都不用改,按照默认配置进行安装。 QT Addin 1.11安装完成之后,就可以在VS里面进行QT项目的开发了。
配置VS2010
然后介绍怎么配置VS2010中的QT目录。
打开VS2010,发现菜单栏多了QT的菜单。
然后点击QT菜单项,选择QT Options选项。
然后按照下图中的步骤,点击Add, 然后选择QT的安装目录,最后点击确定就可以了。
第五步:安装Visual Assist X并配置。
使用qt建立工程,报错
1:注意:打开main.cpp文件,否则 “Qt Project Settings”是灰色,不可选;
2:选择编译机器上的版本: