【问题标题】:How to compile Qt for 64-bit Windows from a 32-bit environment with Visual C++ 2010 Express?如何使用 Visual C++ 2010 Express 从 32 位环境为 64 位 Windows 编译 Qt?
【发布时间】:2012-03-03 05:26:02
【问题描述】:

我正在尝试为 64 位 Windows 编译 Qt 库(我不需要演示或示例)。有说明here,但我遇到了下面评论中描述的错误。似乎在任何地方都没有关于如何进行此过程的参考。

我的目标是 Microsoft Visual C++ 2010 Express。看起来我还需要 Perl 和 Windows SDK - 我该如何进行这个过程?

【问题讨论】:

    标签: visual-studio-2010 qt 64-bit visual-studio-express


    【解决方案1】:

    这个过程相当乏味和耗时 - 但我将在此处详细解释每个步骤,以帮助将来尝试编译 Qt 的其他人。

    1. 第一步是安装所有先决条件。

      • ActivePerl,在配置过程中使用。安装 Perl 后需要重新启动,因为它会修改环境变量。
      • Windows SDK 7.1(以前称为平台 SDK)。选择要安装的组件时,请务必包含 x64 库。

    2. Qt Downloads page 下载 Qt 源文件。

    3. 将存档的内容提取到易于记忆的位置(如C:\)。稍后您需要记住此位置,因为我们将使用它来设置一些环境变量。

    4. 现在打开 Windows SDK 7.1 命令提示符。首先将环境设置为 32 位发布模式(我们需要将一些工具构建为 32 位应用程序):

      setenv /release /x86
      
    5. 设置以下环境变量(以下示例假设您提取到C:\):

      set QTDIR=C:\qt-everywhere-opensource-src-4.8.0
      set PATH=%PATH%;%QTDIR%\bin
      
    6. 现在运行 cd %QTDIR% 并指定配置选项 - 示例如下:

      configure -release -opensource -qt-zlib -qt-libpng -qt-libmng -qt-libtiff
       -qt-libjpeg -qt-style-windowsxp -qt-style-windowsvista -platform
       win32-msvc2010
      
    7. 一旦配置过程完成,cdsrc目录并运行:

      qmake
      nmake
      

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

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

      setenv /x64
      

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

    9. 运行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 位版本。

    10. 现在由于一些依赖问题,这里的事情变得非常复杂。 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
      

      可能有更好的方法来做到这一点,但我还没有想出来:)

    11. 现在我们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 库并跳过工具依赖项。请注意,这也可能需要相当长的时间。

    12. 您现在应该在 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-19175bugreports.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-11445QTBUG-19175

    我按照 George 的说明编译了 Qt 4.8.2 64 位二进制文​​件,包括 OpenSSH 库。另外,我申请了Microsoft's hotfix,修复了编译器的bug。

    为了您的方便,我提供了生成的 64 位库,可从此处下载:https://www.box.com/s/8948c60c3cdd743ef83b

    【讨论】:

    猜你喜欢
    • 2010-12-24
    • 1970-01-01
    • 2011-03-04
    • 2013-07-17
    • 2012-12-30
    • 1970-01-01
    • 2011-08-01
    • 2013-05-19
    • 2012-05-15
    相关资源
    最近更新 更多