如何在使用Visual C++ 2010 Express的32位环境中编译64位Windows的Qt?

8

我正在尝试为64位Windows编译Qt库(不需要演示或示例)。这里有链接的说明,但我遇到了下面评论中描述的错误。似乎没有任何参考资料介绍如何进行此过程。

我当前的目标是Microsoft Visual C++ 2010 Express。看起来我还需要Perl和Windows SDK - 我该怎么做?

2个回答

13

这个过程相当繁琐且耗时 - 但为了帮助将来试图编译Qt的其他人,我将在此详细介绍每个步骤。

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

    • ActivePerl,用于配置过程。安装完Perl后需要重新启动计算机,因为它会修改环境变量。
    • Windows SDK 7.1(以前称为平台SDK)。安装组件时请务必包括x64库。
  2. Qt下载页面下载Qt源代码存档。

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

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

  5. 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 上回答一些问题的好时机 :)

  6. 工具已经构建好了,你需要将Qt编译为64位库。输入以下命令:

  7. setenv /x64
    

    您需要再次设置第5步的环境变量,请输入以下命令:

  8. 运行cd %QTDIR%,然后重新运行configure命令一定要指定一个附加选项::

    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位版本。

  9. 现在由于某些依赖问题,情况变得非常复杂。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
    

    可能有更好的方法,但我还没有想出来 :)

  10. 现在我们再次cd进入src目录并运行以下命令

  11. 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 应用程序中。

  13. 编辑: 结果证明即使如此也不够,因为在连接 QtWebKit4.dll 库时仍然遇到了一些问题(关于未解决的符号)。事实证明,别人已经找到了解决方法,您需要在 WebCore.pro 中将 QMAKE_HOST.arch 更改为 QMAKE_TARGET.arch

    此外,上述选项将构建没有 OpenSSL 支持的 QNetwork4.dll(您将无法访问 HTTPS 站点-即使在 QWebView 中)。幸运的是,修复起来并不太难。下载并编译 OpenSSL(Win64),并将以下选项附加到步骤#9中的命令:

    -openssl -I C:\OpenSSL\inc32 -L C:\OpenSSL\out32dll
    

    (如果您将 OpenSSL 安装在 C:\OpenSSL 以外的其他位置,则需要更改路径。)


    进一步编辑:为了方便起见,我已经将编译好的库上传到此处:
    http://www.box.com/s/9710cbb278ef4890a7b5


1
然而,人们仍然认为Qt是应用程序开发的万灵药,它美丽简单,易于使用。但我还没有看到任何证据证明这一点。当我尝试使用它时,我的结论是它根本不值得,特别是考虑到一旦你完成了,你仍然没有一个完全本地化的应用程序。 - Cody Gray
@CodyGray:完全不同意——否则你为什么要如此费力地使用它呢? - Nathan Osman
@GeorgeEdison:我正在使用您编译的64位二进制文件编译我的Qt应用程序,但是我的应用程序崩溃了。我认为这与我使用的QTableView有关,由于MS Visual C++编译器中的一个错误导致其崩溃,请参见https://bugreports.qt-project.org/browse/QTBUG-19175和https://bugreports.qt-project.org//browse/QTBUG-11445。您是否使用MSVC SP 1来编译二进制文件?我现在正在重新编译Qt 64位版本,但我之所以问这个问题是因为我认为您上传的编译库对其他人也很有用,因此它们必须无错误。 - yori
@Yori:我不太确定 - 我使用的是当前随 Windows SDK 7.1 发货的任何内容。 - Nathan Osman
@GeorgeEdison:我刚刚安装了Microsoft的MSVC热修复程序,并在重新编译Qt库后发现它确实修复了崩溃问题。因此,看起来您的二进制文件确实受到了该漏洞的影响。您能否在安装SP1之后重新编译并上传这些二进制文件呢?(我很乐意做出贡献,但您似乎比我更有经验和知识)顺便说一下,这就是为什么Qt网站上没有64位Qt二进制文件的原因之一。 - yori
@Yori:说实话,我的电脑配置经常变化,所以我现在没有轻松访问我的MSVC安装。如果你已经成功构建了它们,那太棒了,我没有反对你上传你的构建到某个地方,并在这里链接它。 - Nathan Osman

1

正如我在对George Edison的回答中所提到的评论中,Windows SDK 7.1附带的Microsoft Visual C++编译器存在一个错误。有关此信息,请参见QTBUG-11445QTBUG-19175

我按照George的说明编译了Qt 4.8.2 64位二进制文件,包括OpenSSH库。此外,我还应用了Microsoft的热修复程序来修复编译器错误。

为了方便您,我已经将生成的64位库提供下载,链接在这里:https://www.box.com/s/8948c60c3cdd743ef83b


我也遇到了相同的兼容性问题,然后我安装了SDK 7.0并参考了这个方法,它对我有用http://qtitkvtkhelp.blogspot.in/2013/04/qt-64-bit-build.html - QT-ITK-VTK-Help

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接