由于项目需要用到64位的库,默认安装的opensource版本只带32位库,只能自己编译了。折腾了两三天,最后找到适合自己的靠谱方法记录一下。下面介绍两种方法编译:   第一种办法是使用jom来编译,编译出来在VS中运行x64项目正常,但是Qt Designer无法使用;第二种办法是使用VS2010编译,暂时未发现异常。

1. 准备工作

必须安装 1.1.1 qt-win-opensource-4.8.5-vs2010.exe 1.1.2 qt-vs-addin-1.1.11-opensource.exe 1.1.3 Visual Studio 2010 在官网下好Qt及插件的安装包,并安装好(默认路径是C:\Qt\4.8.5)选择安装 1.2.1 Visual C ++ 2010包含Qt编译所需的所有必需的SDK。如果需要使用Qt With Phonon,需要先安装DirectX SDK。 1.2.2如果编译Qt版本> = 4.8.0,请安装Perl (博主装的是Strawberry Perl) 1.2.3 如果选择用jom编译,请安装jom jom是qt官方的,它支持多核编译,可以大大加快编译速度。 下载完成后安装qt-win-opensource-4.8.5-vs2010.exe

2. Patch

  由于源码中存在BUG,编译过程中会报错,整个编译过程需要花费很长的时间,所以建议在编译前就先修改好。下面有三个文件需要修改:

文件1 C:\Qt\4.8.5\mkspecs\win32-msvc2010\qmake.conf 第19行 (最后多了一个减号) QMAKE_CFLAGS = -nologo -Zm200 -Zc:wchar_t- 改为 QMAKE_CFLAGS = -nologo -Zm200 -Zc:wchar_t 文件2 C:\Qt\4.8.5\src\3rdparty\webkit\Source\JavaScriptCore\wtf\HashSet.h 177-190行 如不修改,编译报错如下: .\wtf/HashSet.h(180) : error C2664: ‘std::pair<_Ty1,_Ty2>::pair(const std::pair<_Ty1,_Ty2> &)’ : cannot convert parameter 1 from ‘std::pair<_Ty1,_Ty2>’ to ‘const std::pair<_Ty1,_Ty2> &’ 修改如下:(下载链接:HashSet.h)

template

inline pair::const_iterator, bool> HashSet::add(const ValueType &value)

{

auto p= m_impl.add(value);

return make_pair(typename HashSet::const_iterator(p.first), p.second);

}

template

template

inline pair::iterator, bool>

HashSet::add(const T& value)

{

typedef HashSetTranslatorAdapter Adapter;

typedef typename HashSet::iterator iter_type;

auto& temp = m_impl.template addPassingHashCode(value, value);

return make_pair((iter_type)temp.first, temp.second);

}

/*template

inline pair::iterator, bool> HashSet::add(const ValueType& value)

{

return m_impl.add(value);

}

template

template

inline pair::iterator, bool>

HashSet::add(const T& value)

{

typedef HashSetTranslatorAdapter Adapter;

return m_impl.template addPassingHashCode(value, value);

}*/

文件3 C:\Qt\4.8.5\src\3rdparty\webkit\Source\WebCore\platform DefaultLocalizationStrategy.cpp 325和327行 如不修改,编译报错如下: platform\DefaultLocalizationStrategy.cpp(327) : error C2001: newline in constant platform\DefaultLocalizationStrategy.cpp(327) : fatal error C1057: unexpected end of file in macro expansion 修改如下:(下载链接: DefaultLocalizationStrategy.cpp)

//return formatLocalizedString(WEB_UI_STRING("Look Up “%@”", "Look Up context menu item with selected word"), selectedCFString.get());

return formatLocalizedString(WEB_UI_STRING("Look Up ""%@""", "Look Up context menu item with selected word"), selectedCFString.get());

#else

//return WEB_UI_STRING("Look Up “”", "Look Up context menu item with selected word").replace("", truncatedStringForLookupMenuItem(selectedString));

return WEB_UI_STRING("Look Up """"", "Look Up context menu item with selected word").replace("", truncatedStringForLookupMenuItem(selectedString));

3. 设置环境变量

在系统环境变量下添加 QTDIR = C:\Qt\4.8.5 QMAKESPEC = win32-msvc2010

在已有的Path环境变量后面加上C:\Qt\4.8.5\bin (注意不要忘记最后的;分号分隔符)

4. 配置工程

Start > Programs > Microsoft Visual Studio 2010 > Visual Studio Tools > Visual Studio X64 Command Prompt. 打开Visual Studio x64 Win64 Command Prompt (2010) 注意是x64

cd c:\Qt\4.8.5 configure -debug-and-release -opensource -platform win32-msvc2010

Y 回车

配置完毕

5. 编译

下面有两种使用不同工具的编译方法,选择一种即可。 Tips:编译时间较长,最好选择空闲时间多的时间进行。

使用jom来编译,编译出来在VS中运行x64项目正常,但是Qt Designer无法使用。

..\jom\jom.exe -j 8 (参数-j 表示用于qt编译的CPU核心数目,博主PC CPU:i7-4790 8核) 在第四步配置完之后可以直接运行此命令编译。 如果编译完之后在VS项目中无法打开*.ui文件,可以自己单独安装一个Qt Creator来设计界面。

使用VS2010编译,暂时未发现异常。 经过漫长的等待 编译完成

6. 配置Qt for VS插件

安装插件qt-vs-addin-1.1.11-opensource.exe 安装完成后菜单栏会多出一项Qt,然后VS2010 > Qt > Qt Options进行配置 。

Add > 填写Qt安装路径:C:\Qt\4.8.5 > OK > 在下方选择QT的默认版本。

如果你有多个QT,可以右击工程文件,选择Qt Project Settings选择版本。

Properties中可以选择需要使用的Version

7. 测试

新建项目Qt Application

一路Next > Next > Finish

工程目录结构

由于编译Qt库是64bit的,所以需要把Platform从Win32修改为x64,并在项目右键Qt Project Settings的Properties处设置Version为4.8.5。

测试代码

#include "qttest.h"

#include

#include

int main(int argc, char *argv[])

{

QApplication a(argc, argv);

QLabel *label = new QLabel("

Just for test .

");

label->show();

return a.exec();

}

运行结果

参考链接

https://www.sxzhongrui.com/questions/12113400/compiling-qt-4-8-x-for-visual-studio-2012 http://www.sxzhongrui.com/pavel/2011/02/01/how-to-compile-qt-4-7-with-visual-studio-2010 http://www.sxzhongrui.com/russinovich/archive/2012/06/30/2571032.html http://www.sxzhongrui.com/kernlen/article/details/9311357

一、编译前准备

编译工具:Visual Studio2010旗舰版

QT源代码:QT5.0.2?https://www.sxzhongrui.com/archive/qt/5.0/5.0.2/single/qt-everywhere-opensource-src-5.0.2.ziphttps://www.sxzhongrui.com/archive/qt/5.0/5.0.2/single/www.sxzhongrui.com

64位Python工具:Python2.7 ?点击下载

64位Ruby工具:Ruby2.7.5.1 ?点击下载

64位Perl工具:Perl5.12.2?点击下载

DXSDK库:DXSDK_Jun10 ?点击下载

操作系统:Windows 7 旗舰版

二、开始编译

1、启动VS2010的64位命令行,并切换至QT的源码目录中:

2、进行编译配置:

configure -prefix D:\qt5.1.0_x64 -mp -opensource -confirm-license -nomake tests -nomake examples -debug-and-release -opengl desktop

?3、nmake编译源码:

在命令行执行nmake命令

?4、可能遇见的错误:

? ? ? ? 在编译过程中可能会遇到一些错误,可以先使用 nmake /k命令暂时先跳过错误继续编译,然后在重新执行nmake命令即可,也可以结合自己编译过程中实际遇到的问题具体寻求解决办法或者笔者进行沟通,共同寻找更加优良的解决办法。

5、编译结束安装QT的SDK

?

记得点赞收藏,谨防丢失哦!!!

编译环境:

(1) win7/64

(2) VS2010

(3) www.sxzhongrui.com

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)打开这个文件:\src\3rdparty\webkit\Source\WebCore\platform\DefaultLocalizationStrategy.cpp?????? 按Ctrl+G定位?到?327?行,?改为:????return?WEB_UI_STRING("Look?Up?\"\"",?"Look?Up?context?menu?item?with?selected?word").replace("",?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:NO

? ? ? QMAKE_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__?*?__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。

就这问题,笔者重新罗列一下步骤:

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

#include

#include

#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并配置。

? ? ??

首先安装Visual Assist X的安装包,按照默认安装即可。

? ? ? 然后重新打开VS2010,发现菜单项多了VAssistX。

? ? ??

? ? ? 然后,点击VAssistX菜单,并选择Visual Assist Options选项。

? ? ? 然后按照下面的步骤,依次点击,选择要包含的QT库文件。

? ? ?

? ? ? 最后要添加的常用的库为:(如果日后,要用其他的库文件,再添加即可)

? ? ? 最后再选择Visual Assist Options选项,点击Performance选项,点击Rebuild即可。

? ?

使用qt建立工程,报错

? ? ?

1:注意:打开main.cpp文件,否则 “Qt Project Settings”是灰色,不可选;

2:选择编译机器上的版本:

Version修改为Qt4.8.6版本,而不是msvc2010即可

0条大神的评论

发表评论