【问题标题】:How do I specify which Windows SDK version qmake shall target?如何指定 qmake 应针对哪个 Windows SDK 版本?
【发布时间】:2018-03-04 21:29:48
【问题描述】:

我的 PC 上安装了 Visual Studio 2017 社区版。 最近我安装了Qt5.10.1。 我从示例 .pro 文件之一生成了一个 VS 项目:

qmake -tp vc cube.pro

但是,当我打开这个 VS 项目并构建它时,我得到了错误:

未找到 Windows SDK 8.1 版。安装所需版本的 Windows SDK 或在项目属性页面中更改 SDK 版本,或右键单击解决方案并选择“重新定位解决方案”。

我如何为所有 qmake 指定一次以 Windows SDK 10.0 而不是 8.1 为目标,这样我每次使用 qmake 生成 VS 项目时都不必手动重新定位?

【问题讨论】:

  • 特定版本的 Qt 以特定的 Windows SDK 为目标。 qmake 只是反映了这一点。为您想要的 SDK 构建一个 Qt 副本,其qmake 将引用它。 qmake 选择您需要的 Qt 的确切版本,以及它的所有依赖项。 IE。要为特定的 Qt 构建,请在初始化构建文件夹时使用其 qmake
  • 我运行了 qt-unified-windows-x86-3.0.2-online 安装程序并选择了 MSVC 2017。因此我认为 qmake 生成的项目应该开箱即用。我还注意到 Qt 命令窗口显示:为 Qt 使用设置环境...记得调用 vcvarsall.bat 来完成环境设置!尽管 2017 vcvars.bat 脚本位于我的 PATH 变量中。好像安装程序有问题?也许毕竟不支持2017?我注意到在 Qt/vcredist 目录中有 2015 个 redist 而不是 2017。

标签: qt qmake


【解决方案1】:

您无法从qmake 中选择 Windows SDK 版本。 qmake 期望在运行之前正确设置环境。

如果您直接使用命令行,您将看到以下消息:Remember to call vcvarsall.bat to complete environment setup!。 这意味着您必须使用正确的选项运行 vcvarsall.bat 来设置 MSVC 工具链,包括您选择的 Windows SDK 版本。

一些例子:

# MSVC 2017 for 64 bit 
vcvarsall.bat amd64
# MSVC 2017 for 64 bit using Windows 8.1 SDK
vcvarsall.bat amd64 8.1
# MSVC 2017 for 64 bit using Windows 10 SDK version 10.0.10240.0
vcvarsall.bat amd64 10.0.10240.0
# MSVC 2015 (installed with 2017 installer) for 64 bit using Windows 10 SDK version 10.0.10240.0
vcvarsall.bat amd64 10.0.10240.0 -vcvars_ver=14.0

还有来自vcvarsall.bat的帮助信息:

Syntax:
    vcvarsall.bat [arch] [platform_type] [winsdk_version] [-vcvars_ver=vc_version]
where :
    [arch]: x86 | amd64 | x86_amd64 | x86_arm | x86_arm64 | amd64_x86 | amd64_arm | amd64_arm64
    [platform_type]: {empty} | store | uwp
    [winsdk_version] : full Windows 10 SDK number (e.g. 10.0.10240.0) or "8.1" to use the Windows 8.1 SDK.
    [vc_version] : {none} for default VS 2017 VC++ compiler toolset |
                   "14.0" for VC++ 2015 Compiler Toolset |
                   "14.1x" for the latest 14.1x.yyyyy toolset installed (e.g. "14.11") |
                   "14.1x.yyyyy" for a specific full version number (e.g. 14.11.25503)

The store parameter sets environment variables to support Universal Windows Platform application
development and is an alias for 'uwp'.

For example:
    vcvarsall.bat x86_amd64
    vcvarsall.bat x86_amd64 10.0.10240.0
    vcvarsall.bat x86_arm uwp 10.0.10240.0
    vcvarsall.bat x86_arm onecore 10.0.10240.0 -vcvars_ver=14.0
    vcvarsall.bat x64 8.1
    vcvarsall.bat x64 store 8.1

如果您使用 Qt Creator,那么您就不走运了。 Qt Creator 仅检测已安装的 MSVC 工具链,但不提供任何方法来向 vcvarsall.bat 调用添加选项或手动添加 MSVC 工具链。

【讨论】:

  • OK 所以我跑了:C:\Qt\Examples\Qt-5.10.1\opengl\cube>"C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\辅助\Build\vcvarsall.bat" amd64 10.0.16299.0 后跟qmake -tp vc cube.pro。但是生成的 VS 项目仍然有 8.1 作为 Windows SDK 版本。
  • 另外我在安装 Qt 时指定了 VS2017 x64 那么为什么 Qt 命令窗口默认不运行这个 vcvarsall.bat 文件?当我每次打开 Qt cmd 窗口时都必须这样做时,它会变得乏味。
  • @Andy qmake 忽略所选 SDK 可能是一个错误。对于 vcvarsall.bat,默认情况下不会这样做,因为 Qt 开发人员无法知道您在计算机上安装 MSVC 的位置以及您选择的版本。您可以通过编写启动命令提示符并为您设置 Qt 和 MSVC 环境的脚本来解决此问题
  • @Andy 如果您的目标是在 Visual Studio 中开发 Qt 应用程序,您可能需要使用 Qt Visual Studio 工具:download.qt.io/official_releases/vsaddin
  • 感谢您的帮助!我想我现在明白了。
【解决方案2】:

请先阅读 Benjamin T 的答案。这个答案详细说明了如何使用QtCreator

进行配置

QtCreator 允许指定传递给vcvarsall.bat 的参数。转到工具 > 选项 > 套件 > 编译器:

  • 克隆所需的自动检测编译器
  • 初始化的最后一个字段中填写所需的 Windows SDK 版本:
  • 可选:更新名称以便在下一步中轻松找到它
  • 在 Kits > Kits 下,将编译器更改为新创建的编译器(用于所需的 Kits)。

【讨论】:

  • 这确实有效,并且是正确的程序。
猜你喜欢
  • 2013-03-23
  • 1970-01-01
  • 1970-01-01
  • 2016-11-03
  • 1970-01-01
  • 2011-09-14
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多