如何让 Qt5 下载并与 Visual Studio 2012 集成?您会遇到哪些问题,您如何解决这些问题?
更新重新。视觉工作室 2013
Visual Studio 2013 也报告了成功,并且正在为 VS 2013 维护注释。
另请注意,问题的重点是仅使用 Visual Studio构建Qt。还有关于与 Visual Studio IDE 集成的注意事项
如何让 Qt5 下载并与 Visual Studio 2012 集成?您会遇到哪些问题,您如何解决这些问题?
更新重新。视觉工作室 2013
Visual Studio 2013 也报告了成功,并且正在为 VS 2013 维护注释。
另请注意,问题的重点是仅使用 Visual Studio构建Qt。还有关于与 Visual Studio IDE 集成的注意事项
此方法经过测试可在 Visual Studio 2013 上运行。使用 Visual Studio 2012 和 2013 的预构建二进制文件可在此处获得,包括 OpenGL 版本。
在此处下载并安装 RapidEE 。RapidEE 是一个 Windows 环境变量编辑器。它对于这个过程的其余部分(并且只是一般来说)非常有用。
安装 DirectX 11 SDK。它现在是 Windows 8 SDK 的一部分,因此您首先必须安装 DirectX 10 SDK,您可以在此处获取(但请参阅下一句中的警告)。如果您安装了 Visual C++ 2010 Redistributable Package,并且您可能已经安装了(它与 VS 2010 一起自动安装),请按照此处列出的步骤帮助安装 DirectX 10。安装 DirectX 10 SDK 后,请在此处下载并安装 Windows 8 SDK ,其中包含 DirectX 11 SDK。 是的,这很痛苦,但除非您知道自己拥有 DirectX 11 SDK,否则 Qt 构建将失败。
从Python.org或Anaconda Python安装适用于 Windows 的 Python(我听说过 2.6+,使用 3.3)。
从ActiveState安装 Perl for Windows 。
按照qt-project 网站上的Windows 安装指南进行操作。
概括
总结以上链接和以下注释的详细信息(如果您有任何错误,请参阅以下注释;他们可能会得到答复):
卸载 Avast(如果您已安装)以避免构建错误。是的,字面意思是卸载它。将其从系统中 100% 删除。 停用它将不起作用。请参阅下面的详细说明。
第一步的注意事项:不要在git
下面的第一次拉动中使用 SmartGit(除非您真的知道自己在做什么),因为 SmartGit 的默认设置会拉动所有内容,这不是您想要的。
从任何命令提示符窗口中确定要放置Qt
安装的位置,以及cd
将包含新安装的目录。(因为这个过程很脆弱,容易出错,所以我个人直接把它放在了C:
,但这可能没有必要)。
从上面的目录,执行:
git clone git://gitorious.org/qt/qt5.git qt5
这很快。完成后,您应该在“稳定”分支上,但您始终可以在进入新创建的目录git checkout stable
后运行,以确保。确认使用VS2013 64 位。cd
qt5
git checkout 5.4.1
在继续下一步之前,关闭当前的命令提示符窗口(如果它不是 Visual Studio 命令提示符窗口)。这是为了确保您在后续步骤中使用 Visual Studio 命令提示符窗口。
接下来运行 32 位 (x86) 或 64 位 VS Tools 命令提示符(取决于您将 Qt5 构建为 32 位还是 64 位)。要访问它,您必须通过“开始”菜单找到它 - 转到Program Files
-> [Microsoft] Visual Studio 2012/2013
-> Visual Studio Tools
,您会在那里看到一个有趣的名字;名称应包含短语Native Tools
;32 位版本将x86
在名称中,64 位版本将x64
在名称中。
cd
qt5
从上述步骤进入新创建的目录。
从 Visual Studio 命令提示符中,必须下载 Qt 子模块的其余部分:
perl ./init-repository --no-webkit
执行此步骤需要一些时间,因为它必须下载很多,但在良好的连接上并不算太糟糕。
然后下载任何剩余的init-repository
未下载的可选子模块 - SmartGit 仅在此阶段开始运行良好(请参阅下面的评论)。
Qt 下载完成后,以下命令准备构建环境(也应使用 [32|64] VS Native Tools 命令提示符执行):
configure -developer-build -opensource -confirm-license -mp -nomake examples -nomake tests -debug-and-release -c++11 -no-warnings-are-errors -platform win32-msvc2012
.
此命令行的注意事项:该c++11
选项在 VS2012 编译器中可能不是必需的,但适用于 VS2013;-no-warnings-are-errors
如果您在 ANGLE 的 64 位自动构建中遇到错误,这是必要的;-platform
自动设置为win32-msvc2012
,因此默认情况下使用 32 位构建的 Qt,并且 -platform 可能不需要在命令行中提供(即使您安装了以前版本的 VS)。对于 VS2013,使用-platform win32-msvc2013
.
执行此步骤需要几分钟,但还不错。
最后,在系统上实际构建 Qt 的命令(也在 VS Native Tools 命令提示符内运行)很简单:
nmake
预计要等待数小时才能完成构建。 如果您指定了一个输出文件夹-prefix
(请参见下面的注释),则使用nmake install
,否则就是这样。
笔记:
一般注意事项
如果您对上面链接的文档感到困惑,只是一个仅供参考,将使用 ANGLE 库(默认情况下)而不是 OpenGL,这就是您必须安装上面的 DirectX 11 的原因。
确保使用 VS Native Tools 命令提示符运行上述链接中的所有命令(即perl .\init-repository --no-webkit
、configure
和nmake
)。您将使用 [32|64] 位命令提示符(x86
或x64
),具体取决于您将 Qt 构建为 32 位还是 64 位。如果您在打开命令提示符的情况下安装 perl(确保它位于 中PATH
),则需要重新启动命令提示符才能将 perl 识别为命令。
运行“init-repository”(来自上述链接中的步骤)时,文档中并不清楚,但您必须通过执行此操作perl
;即perl ./init-repository --no-webkit
。然而, configure
andnmake
命令是直接调用的。
传递给的一个非常有用的选项configure
是-mp
,它会导致 Qt 在多个内核上并行构建,从而显着加快(长)构建时间。
要指定输出文件夹,-prefix [outfolder]
请在configure
命令中添加 。例如,使用-prefix %CD%\output\x64\vc12
将是 64 位 Visual Studio 2013 (12.0) 构建的合适输出(子)文件夹。
Unicode 支持 (ICU)
如果你想要 Unicode 支持(通过ICU),请特别注意上面链接中的说明。总之,ICU 必须在 VS 2012 中从头开始构建,因为 Windows 的唯一预构建 ICU 二进制文件是为 VS 2010 构建的。在 VS 2012 中构建是无痛的 - 只需在 <icuroot>\icu\source 中找到 ICU 解决方案 (.sln) \allinone,并在调试和发布模式下构建(在 32 位或 64 位模式下,取决于您构建 Qt 的模式 - 不要构建其他位,因为 ICU 将覆盖输出文件夹二进制文件)。(Qt 构建过程将正确定位 ICU 的调试与发布构建。)它应该构建没有错误。然后,将 <icuroot>\lib 的路径作为字符串条目添加到(可能)名为“LIB”的新 Windows 环境变量中(您可以为此使用 Rapid EE;使 LIB 成为“可扩展字符串” 在 RapidEE 中,即使只有 1 个条目),并且还将 <icuroot>\include 的路径添加为(可能)名为“INCLUDE”的新 Windows 环境变量中的字符串条目。(注意:将这些路径添加到 PATH 变量将不起作用。)Qt 构建后,您可以删除所有刚刚添加的条目。另外,做将 ICU dll (<icuroot>\bin) 的运行时路径添加到环境的 PATH 变量中,否则 Qt 构建过程(特别是在uic.exe
运行时)会产生欺骗性和误导性错误。最后,在configure
命令行(如下)上,一定要添加-icu
一个额外的命令行参数。
重症监护室故障:
目前,当启用 ICU 时,似乎存在使用 VS2012 编译器构建 Qt5 的错误。具体来说,qtbase\src\corelib\codecs\qtextcodec.cpp
第 688 行(Qt5 v5.02)未能返回编解码器名称“US-ASCII”的编解码器(编解码器为 NULL),导致“lrelease.exe”在稍后尝试取消引用编解码器时崩溃(我已经迷失了方向该文件/行号,但它是 NULLcodec
变量的明显取消引用)。不幸的是,这意味着据我所知,WebKit 不能用(至少)32 位的 Qt5 和 VS2012 编译器构建,因为 WebKit 需要 ICU。
如果有人能够使用启用 ICU 的 VS2012 编译器构建 Qt5,请更新此 Wiki 并说明。
ICU 说明:
如果你的路径中有 ICU,Qt 会自动构建它。换句话说,标志“ -icu
”是隐含的。但是,这会导致上面提到的“lrelease.exe”错误。所以解决这个问题的方法是将标志 -no-icu 添加到配置命令中
附加子模块
如果除了默认子模块之外还需要子模块,您可以在完成命令后使用 SmartGit(或命令行)init-repository
。SmartGit 可能是最简单的,因为您不需要将路径复制到命令行,而是可以直接使用用户界面。
警告:不要下载 OPTIONAL qlalr
SUBMODULE,因为它不会与整个 Qt 构建一起构建,并且对于 Qt 用户来说不是必需的,但仅用于内部 Qt 开发。
警告:必须使用shell 命令行,后跟perl .\init-repository --no-webkit
,(不是 SmartGit);这些步骤只会正确下载默认的 Qt 子模块。您不能使用 SmartGit 来克隆和下载 Git 文件,git://gitorious.org/qt/qt5.git
因为 SmartGit 当前无法正确处理子模块。相反,打开一个标准的 Windows shell 命令提示符(使用任何命令提示符应用程序,不一定是 VS Tools 命令提示符),并且(假设 Git 已正确安装在系统上;SmartGit 安装可能会或可能不会自动执行此操作;如果没有,去Git for Windows直接安装)git clone git://gitorious.org/qt/qt5.git
直接从命令行输入;也许跟随git checkout stable
(我不确定这个分支是否默认签出);然后使用命令行perl .\init-repository --no-webkit
拉下默认存储库(WebKit 除外,它需要 ICU 和 ICU 似乎无法在 VS2012 的 32 位 Qt5 中构建;请参阅评论)。
因此,下载所有必要的 Qt 源文件的步骤是: 1. 使用 Windows 命令行执行初始git clone git://gitorious.org/qt/qt5.git
; 2.perl .\init-repository --no-webkit
从 VS Tools 2012 命令提示符中执行;然后可选 3. 使用 SmartGit(来自上面的链接)(或等效项)“打开现有项目”(选择 Qt5 根文件夹)并从 SmartGit 中进行拉取以下载任何非默认存储库(但不要下载qlalr
) . 就是这样; 您的系统上有所有必要和可选的 Qt 文件(包括子模块)。
如果有人发现其他可选子模块无法构建和/或仅供内部使用(除了qlalr
),请更新此 Wiki 以指定它们。
一般来说,通过默认获取的子模块perl .\init-repository --no-webkit
就足够了。如果您知道或稍后发现您的其他(非默认)模块,您可以随时添加它们。
一般问题
如果在某些时候您收到错误说命令“python”(或任何类似的)无法识别,只需检查包含python.exe
(或适当的.exe
)的文件夹是否是路径变量的一部分。如果不是,请添加它(为方便起见,使用上面提到的 RapidEE)并再次尝试您正在执行的操作。如果它在那里,请确保在将命令添加到路径后重新启动命令提示符。
另外两个与路径相关的问题需要注意(引自与上述链接相关的文档):“确保在 msysgit 提供的 perl 可执行文件之前的路径中找到 perl 可执行文件,因为后者已过时”;和“如果 sh.exe 在您的 PATH 中(例如由于 git 或 msys 安装),您可能无法构建。此类错误由 qt5-srcqtbasebinqmake.exe: command not found 等指示。在这种情况下,请确保 sh.exe 不在您的路径中。如果您的安装已配置,则必须重新配置。 "
在此过程中,您可能会在使用文件时遇到错误nmake
。如果这样做,只需进入该目录并强制构建问题文件。nmake
然后再次在 Qt5 上开始该过程。
具体问题
警告:您可能需要在 Qt过程中禁用防病毒软件和沙盒nmake
(为了安全起见,在整个过程中)。在内部,Qt 执行许多防病毒程序可以干扰的可执行文件(有时是静默)。特别是,如果您有任何沙盒软件,请务必禁用沙盒。
警告: 阿瓦斯特!沙盒用户:Avast 沙盒有一个错误,即使您禁用 Avast 的自动沙盒,沙盒也不会关闭,它会rcc
在 Qt 的构建过程中静默沙盒由 Qt 程序自动创建的所有资源文件。对于任何安装了 Avast 自动沙盒功能的用户,即使关闭了自动沙盒功能,Qt 构建总是会失败。解决此问题的唯一方法是完全卸载 AVAST!在构建 Qt 之前从您的系统中获取。您可以重新安装 Avast!Qt构建完成后。
Qt5 的编译可能需要很长时间(几个小时,即使使用 -mp 多线程选项也是如此)。耐心。
下载并安装 Visual Studio Qt5 插件。它位于页面底部附近的“其他下载”部分,不适用于 Visual Studio Express。
打开 Visual Studio 2012,然后转到Qt Options
(它在顶部菜单栏的“Qt5”下)。
在 Qt Versions 选项卡中,检查 Qt5 是否已经存在。如果不是,请单击添加,选择一个版本名称(可能是 5.xx 之类的名称),然后导航到包含qmake.exe
(通常C:\Qt\qt5\qtbase
)的文件夹。
退出 Qt 选项对话框。
创建一个新的 Visual Studio 项目。当您看到“新建项目”对话框时,您应该看到“Qt5 Projects
模板”选项。
有了新的 Qt 项目后,右键单击它并选择“转换为 QMake 生成的项目”。构建项目,然后再次右键单击它并选择“将项目转换为 Qt 插件项目”。再次构建,然后运行。您现在应该有一个工作的 Qt 项目。
本部分可能适合您,也可能不适合您。如果您遇到问题或有其他/更好的解决方案,请发表评论或编辑相应的步骤。
在 VS 中右键单击您的项目,然后选择“卸载项目”。再次右键单击该项目,然后选择“编辑[项目名称].vcxproj”。这将打开项目文件,以便您可以将 Qt5 添加到其中。
转到 Global PropertyGroup,然后添加或更改<Keyword>
为 Qt4VSv1.0。
重新加载项目,然后右键选择“Convert project to Qt Add-in project”
等待转换完成(不会超过几秒钟),然后选择Qt5>Project Settings
。转到 Modules 选项卡,然后检查您希望项目依赖的模块(基本模块是Core
、Widgets
和GUI
)。
按照此处的步骤,添加目录$(QTDIR)\include
。
笔记:
如果在任何时候你都包含windows.h
,你需要在这样做#define NOMINMAX
之前防止与qdatetime.h
.
完成上述步骤后,您可以通过选择 使您的项目可供 Qt Creator 使用Qt5>Create basic .pro file
。
尾注:如果您对本指南中包含的信息有任何疑问,请将其作为新问题发布(此处不是答案),并且可能会添加答案或答案的链接。
基于上面优秀的 wiki 和这个 qt-project 链接,我成功地将 Qt 5.0.2 与 Windows 7 上的 Visual Studio 2012 集成。由于我以稍微不同的方式进行了一些步骤,因此我认为将其发布在此处是有效的:
下面的顺序应该按照给定的确切顺序执行:
0 - 卸载 Avast(如果已安装)以避免构建错误。由于 Avast 错误,停用它将不起作用;
1 - 安装 Git (>= 1.6.x);
2 - 安装 Python (>=2.6.x)。[python.org];
3 - 安装 Perl (>=5.14)。[activestate.com];
4 - 安装红宝石。[rubyinstaller.org];
5 - 打开 Windows 7 命令提示符(现在不要使用 VS2012 开发者命令提示符);
6 - 为 qt5 选择您想要的任何目录,关于所选路径不允许有空格。我决定使用路径“C:\qt5”;
7 - 返回 Windows 7 命令提示符(在我的情况下,提示“C:\qt5>”)类型:
git clone git://gitorious.org/qt/qt5.git qt5
8 - 签出稳定版本:
cd qt5
git checkout stable
9 - 您可能会收到一条消息,确认此版本已经稳定。关闭命令提示符;
10 - 打开 Visual Studio 的开发人员控制台(所有程序 > Visual Studio 2012 > Visual Studio 工具 > VS2012 的开发人员命令提示符)并将当前目录更改为您选择的目录(在我的示例中为“C:\qt5”);
11 - 下载 Qt 子模块,忽略 webkit(构建错误的常见来源......):
perl .\init-repository --no-webkit
12 - 现在输入这个巨大的命令来正确配置你的构建:
configure -developer-build -opensource -nomake examples -nomake tests -nomake demos -debug-and-release -c++11 -mp -nomake webkit -confirm-license
13 - 接下来,确保不会构建模块qlalr。为此,请打开 Windows 资源管理器并导航到您选择的 Qt 目录(在我的示例中为“ C:\qt5 ”)并检查文件夹qlalr 是否存在。如果是,请删除它;
14 - Time to build... 可能的构建错误来自辅助模块(例如 webkit),这不会影响 Qt 的主要功能(webkit 本身应该没有问题,因为我们之前已将配置设置为不构建它)。然后我们可以忽略它们并保持构建在独立模块上运行:
nmake /I /K
15 - 要完成集成,请按照上面社区 wiki 的第 3 步(“第 3 步:将 Qt5 与 Visual Studio 2012 集成”)进行操作。
只想提一下,在http://qt-project.org/downloads上提供了用于 Visual Studio 2012 的 Qt 5.2 的预构建版本。因此,如果您对从源代码构建 Qt 5 没有特别的兴趣,您也可以使用预构建二进制文件。
Tver-Soft 网站上还有几个用于不同编译器版本的预编译 (x64) 二进制文件。
我终于能够使用 Visual Studio 2012 在 Windows 8 x64 上使用 QWebKit 编译 QT 5.1 (git),并认为我会与那些有问题的人分享我的经验。
按照上述帖子中的说明执行步骤 1 和 2。我尝试执行第 3 步,但 SmartGit 提取了一堆无法使用 Qt5 编译的额外项目。我能够通过从不同的 fork(例如https://qt.gitorious.org/qt/qt3d/ )克隆来解决大部分问题,但这对于每个额外的模块来说都太繁琐了,所以我决定不编译任何一位。
ICU support in a 32-bit build of Qt5 with VS2012 compiler 的帖子导致 Qt5 构建失败;因此,Webkit 也无法构建告诉我如何解决 ICU 问题。
在http://download.icu-project.org/files/icu4c/51.2/icu4c-51_2-src.zip下载源代码并添加该行
#define U_CHARSET_IS_UTF8 1
到文件 %ICU%\source\common\unicode\platform.h ,其中 %ICU% 是 ICU 源代码的路径。
在 Visual Studio 2012 中打开 %ICU%\source\allinone\allinone.sln 文件并编译。将 %ICU%\bin 添加到您的路径
set PATH=%ICU%\bin64;%PATH%
然后我在QT根目录下运行如下命令
configure -platform win32-msvc2012 -opengl desktop -opensource -debug-and-release -I %ICU%\include -L %ICU%\icu\lib64 -mp -qt-freetype -icu
在这一点上,我开始怀疑没有人试图做我正在做的事情,因为 nmake 开始抱怨 makefile 中的意外行(所有这些都有扩展名 DerivedSources,例如 Makefile.JavaScriptCore.DerivedSources 和 Makefile.WebCore.DerivedSources ))
(set PATH=<stuff>;%PATH%) && ....
在运行 nmake 之前手动设置 PATH 并删除直到并包括 && 的字符,例如
(set PATH=<stuff>;%PATH%) && perl -ne "print $1" css\CSSPropertyNames.in ...
变成
perl -ne "print $1" css\CSSPropertyNames.in ...
最后,这些文件之一将尝试调用 win_flex.exe(或 win-flex.exe)而不是 flex。我将其更改为 flex.exe,最终编译所有内容(必须更改两次,因为我认为文件已重新生成)。
对使用 QWebKit 并与此构建相关联的程序的简要经验让我相信一切都很好。
- 更新 -
只是为了完整。根据What does (set PATH=...;%PATH:)=^)%) mean in a Windows shell script,以及如何在 Qt5 nmake 构建的上下文中克服这一行的失败?(指向http://qt-project.org/forums/viewthread/20605)大多数Makefile问题应该可以通过使用jsom而不是nmake来解决(尽管我仍然想知道win-flex.exe)
1-修改qtbase目录中的configure.bat,使其可以生成configure.exe(仅前18行)
@echo off
set QTSRC=%~dp0
set QTDIR=%CD%
rem if not exist %QTSRC%.gitignore goto sconf
echo Please wait while bootstrapping configure ...
for %%C in (cl.exe icl.exe g++.exe perl.exe) do set %%C=%%~$PATH:C
rem if "%perl.exe%" == "" (
rem echo Perl not found in PATH. Aborting. >&2
rem exit /b 1
rem )
if not exist mkspecs (
md mkspecs
if errorlevel 1 goto exit
)
rem perl %QTSRC%bin\syncqt.pl -minimal -module QtCore -outdir "%QTDIR%" %QTSRC%
rem if errorlevel 1 goto exit
2-configure -opensource -confirm-license -mp -nomake examples -nomake tests -release -c++11 -no-warnings-are-errors -platform win32-msvc2015 -no-ltcg
3-nmake