如何使用 Visual C++ 2010 Express 从 32 位环境为 64 位 Windows 编译 Qt?
Posted
技术标签:
【中文标题】如何使用 Visual C++ 2010 Express 从 32 位环境为 64 位 Windows 编译 Qt?【英文标题】:How to compile Qt for 64-bit Windows from a 32-bit environment with Visual C++ 2010 Express? 【发布时间】:2012-03-03 05:26:02 【问题描述】:我正在尝试为 64 位 Windows 编译 Qt 库(我不需要演示或示例)。有说明here,但我遇到了下面评论中描述的错误。似乎在任何地方都没有关于如何进行此过程的参考。
我的目标是 Microsoft Visual C++ 2010 Express。看起来我还需要 Perl 和 Windows SDK - 我该如何进行这个过程?
【问题讨论】:
【参考方案1】:这个过程相当乏味和耗时 - 但我将在此处详细解释每个步骤,以帮助将来尝试编译 Qt 的其他人。
第一步是安装所有先决条件。
ActivePerl,在配置过程中使用。安装 Perl 后需要重新启动,因为它会修改环境变量。 Windows SDK 7.1(以前称为平台 SDK)。选择要安装的组件时,请务必包含 x64 库。从 Qt Downloads page 下载 Qt 源文件。
将存档的内容提取到易于记忆的位置(如C:\
)。稍后您需要记住此位置,因为我们将使用它来设置一些环境变量。
现在打开 Windows SDK 7.1 命令提示符。首先将环境设置为 32 位发布模式(我们需要将一些工具构建为 32 位应用程序):
setenv /release /x86
设置以下环境变量(以下示例假设您提取到C:\
):
set QTDIR=C:\qt-everywhere-opensource-src-4.8.0
set PATH=%PATH%;%QTDIR%\bin
现在运行 cd %QTDIR%
并指定配置选项 - 示例如下:
configure -release -opensource -qt-zlib -qt-libpng -qt-libmng -qt-libtiff
-qt-libjpeg -qt-style-windowsxp -qt-style-windowsvista -platform
win32-msvc2010
一旦配置过程完成,cd
到src
目录并运行:
qmake
nmake
这个过程可能需要相当长的时间,所以现在是休息一下并在 Stack Overflow 上回答一些问题的好时机:)
工具现已构建,您需要将 Qt 编译为 64 位库。输入以下命令:
setenv /x64
您需要再次设置第 5 步中的环境变量。现在输入这些命令。
运行cd %QTDIR%
,然后重新运行configure
命令确保指定一个附加选项:
-no-qmake
选项非常重要——它表示我们要跳过 qmake.exe
程序的编译,因为我们要保留 32 位版本。
现在由于一些依赖问题,这里的事情变得非常复杂。 Qt 构建核心库和其他一些组件所需的工具(如moc
)在src.pro
文件中列为依赖项。这意味着编译器将尝试将它们构建为 64 位应用程序,然后尝试运行它们——这在 32 位系统上当然会失败。所以我们需要做的是编辑src.pro
并自己删除这些依赖项。在第 85 行附近向下滚动并查找以以下开头的行:
!wince*:!ordered:!symbian-abld:!symbian-sbsv2
该部分中的每一行都列出了一个子目标及其依赖项。您现在要做的是删除所有以src_tools_
开头的依赖项。例如:
src_gui.depends = src_corelib src_tools_uic
变成:
src_gui.depends = src_corelib
可能有更好的方法来做到这一点,但我还没有想出来:)
现在我们cd
再次进入src
目录并运行以下命令
nmake sub-winmain sub-corelib sub-xml sub-network sub-sql sub-testlib
sub-gui sub-qt3support sub-activeqt sub-opengl sub-xmlpatterns sub-phonon
sub-multimedia sub-svg sub-script sub-declarative sub-webkit
sub-scripttools sub-plugins sub-imports
这仅构建 Qt 库并跳过工具依赖项。请注意,这也可能需要相当长的时间。
您现在应该在 lib
文件夹中有 64 位库,您可以在 64 位 Qt 应用程序中链接这些库。
编辑:事实证明,即使这样还不够,因为我在链接QtWebKit4.dll
库时仍然遇到了一些问题(关于未解析符号的问题)。原来someone else has already found the solution,你需要把WebCore.pro
中的QMAKE_HOST.arch
改成QMAKE_TARGET.arch
。
此外,上述选项将在没有 OpenSSL 支持的情况下构建 QNetwork4.dll(您将无法通过 HTTPS 访问站点 - 即使在 QWebView 中也是如此)。幸运的是,这并不难解决。为 Win64 下载并构建 OpenSSL 并将以下选项附加到步骤 #9 中的命令:
-openssl -I C:\OpenSSL\inc32 -L C:\OpenSSL\out32dll
(如果您将 OpenSSL 安装在 C:\OpenSSL
以外的其他位置,则必须更改路径。)
进一步编辑:为了省去自己做这件事的麻烦,我把编译好的库上传到这里:http://www.box.com/s/9710cbb278ef4890a7b5
【讨论】:
然而人们仍然在谈论 Qt,就像它是应用程序开发中的灵丹妙药一样,它美观、简单且简单。我还没有看到任何证据。当我尝试使用它时,我的结论是它不值得,特别是考虑到一旦你通过了,你仍然没有一个完全原生的应用程序。 @CodyGray:完全不同意 - 不然你为什么要这么麻烦才能使用它? @GeorgeEdison:我正在用您编译的 64 位二进制文件编译我的 Qt 应用程序,但是我的应用程序崩溃了。我认为这与我使用 QTableView 的事实有关,它由于 MS Visual C++ 编译器中的错误而崩溃,请参阅 bugreports.qt-project.org/browse/QTBUG-19175 和 bugreports.qt-project.org//browse/QTBUG-11445 。您是否使用 MSVC SP 1 编译二进制文件?我现在自己重新编译 Qt 64 位,但我问这个是因为我认为您上传的编译库可能对其他人也有用,因此对它们来说无错误很重要。 @Yori:我不太确定 - 我使用的是 Windows SDK 7.1 目前附带的任何东西。 @GeorgeEdison:我刚刚在安装 Microsoft 的 MSVC 修补程序后重新编译了 Qt 库,它确实修复了崩溃问题。因此,您的二进制文件似乎确实受到了该错误的影响。安装 SP1 后是否可以重新编译和上传二进制文件? (我很乐意贡献,但您似乎比我更有经验和知识)顺便说一句,这也是 Qt 网站上没有 64 位 Qt 二进制文件的原因之一。 【参考方案2】:正如我在乔治爱迪生的回答中提到的那样,Windows SDK 7.1 附带的 Microsoft Visual C++ 编译器中存在一个错误。有关这方面的更多信息,请参阅 QTBUG-11445 和 QTBUG-19175。
我按照 George 的说明编译了 Qt 4.8.2 64 位二进制文件,包括 OpenSSH 库。另外,我申请了Microsoft's hotfix,修复了编译器的bug。
为了您的方便,我提供了生成的 64 位库,可从此处下载:https://www.box.com/s/8948c60c3cdd743ef83b
【讨论】:
我也遇到了同样的兼容性问题,然后我安装了 SDK 7.0 并引用了这个方法,它对我有用qtitkvtkhelp.blogspot.in/2013/04/qt-64-bit-build.html以上是关于如何使用 Visual C++ 2010 Express 从 32 位环境为 64 位 Windows 编译 Qt?的主要内容,如果未能解决你的问题,请参考以下文章
在 Visual C++ 2005 中开发的 Visual C++ 项目 - 在 Visual C++ 2010 中,打开菜单时调试断言失败,但发布模式有效,如何解决?
如何设置 Vim 以使用 Visual Studio 2010 的 C++ 编译器进行编译?
调试时如何在 Visual C++ 2010 中跟踪/输出时间戳
如何防止 Visual Studio 2010 在 C++ 中向我的项目添加大型 SQL 文件?