如何使用 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
    

    一旦配置过程完成,cdsrc目录并运行:

    qmake
    nmake
    

    这个过程可能需要相当长的时间,所以现在是休息一下并在 Stack Overflow 上回答一些问题的好时机:)

    工具现已构建,您需要将 Qt 编译为 64 位库。输入以下命令:

    setenv /x64
    

    您需要再次设置第 5 步中的环境变量。现在输入这些命令。

    运行cd %QTDIR%,然后重新运行configure 命令确保指定一个附加选项

    配置 -release -opensource -qt-zlib -qt-libpng -qt-libmng -qt-libtiff -qt-libjpeg -qt-style-windowsxp -qt-style-windowsvista -platform win32-msvc2010 -no-qmake

    -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 文件?

如何将项目从 Visual C++ 6.0 转换为 Visual Studio Express 2010?

如何使用 Visual C++ 2010 Express 从 32 位环境为 64 位 Windows 编译 Qt?