使用Qt UWP x32/x64套件构建UWP应用的编译问题
Qt 5.9.3 + CppWinRT: x86/x64编译失败(ARMv7可正常编译)
问题梳理
你目前的情况是:
- 已从GitHub获取对应Windows SDK 10.0.16299.0的CppWinRT头文件,用于Qt调用UWP API
- Qt版本为5.9.3,.pro文件已添加头文件路径:
INCLUDEPATH += "C:/Users/cobra/Downloads/Downloads Data/cppwinrt/10.0.16299.0" - 头文件代码:
#include <winrt/windows.devices.enumeration.h> #pragma comment(lib, "windowsapp") using namespace winrt; using namespace winrt::Windows::Devices::Enumeration;
- CPP文件代码:
init_apartment(); // 初始化COM环境 DeviceInformationCollection infos = DeviceInformation::FindAllAsync().get(); for (const auto &info : infos) { qDebug() << QString::fromWCharArray(info.Name().c_str()); }
- 核心问题:只有ARMv7套件能编译通过,x86/x64编译时出现大量来自CppWinRT头文件的错误;移除UWP相关代码后,应用可正常编译运行。
可能的原因分析
Qt 5.9.3默认MSVC编译器版本过低
Qt 5.9.3默认搭配的是MSVC 2015编译器,但CppWinRT 10.0.16299.0依赖C17的特性(比如constexpr、结构化绑定等),MSVC 2015对C17的支持非常有限。ARMv7可能因为编译器的平台特殊处理刚好能绕过部分检查,但x86/x64平台的编译逻辑对标准的校验更严格,所以直接报错。Windows SDK版本不匹配
Qt 5.9.3默认关联的Windows SDK版本可能低于10.0.16299.0,导致x86/x64编译时出现头文件定义冲突、缺失UWP API相关声明的问题。编译选项未开启C++17支持
即使你用了支持C17的编译器,Qt项目默认可能没有开启C17编译开关,这会导致CppWinRT的模板代码无法正常编译。
解决方案
1. 升级MSVC编译器工具链
Qt 5.9.3支持MSVC 2017(需要安装对应版本的Qt套件),MSVC 2017 15.7及以上版本完整支持C++17,能满足CppWinRT的编译要求:
- 安装Visual Studio 2017,确保勾选「C++桌面开发」组件,同时在「单个组件」中选择Windows SDK 10.0.16299.0
- 打开Qt Creator,进入「工具」->「选项」->「构建和运行」->「Kits」,添加或切换到MSVC 2017 x86/x64的Kit,确保编译器和调试器路径指向Visual Studio 2017的安装目录
2. 明确指定Windows SDK版本和编译宏
在你的.pro文件中添加以下配置,强制使用目标Windows SDK版本,避免Qt默认的旧版本:
# 指定Windows 10 SDK版本(对应10.0.16299.0) QMAKE_CXXFLAGS += /DWINVER=0x0A00 /D_WIN32_WINNT=0x0A00 QMAKE_LFLAGS += /SUBSYSTEM:WINDOWS,6.0.16299
3. 开启C++17编译支持
在.pro文件中添加C++17编译开关:
CONFIG += c++17
4. 检查并修复Qt Kit配置
- 确认x86/x64的Kit中,「编译器」选择的是MSVC 2017的对应版本(比如MSVC 2017 32bit或64bit)
- 确认「Windows SDK」选项选择的是10.0.16299.0,如果没有这个选项,需要重新安装对应SDK
5. 清理缓存后重新构建
编译错误有时来自旧的缓存文件,执行以下步骤:
- 删除项目的build文件夹
- 在Qt Creator中点击「清理项目」,然后点击「构建项目」
按照这些步骤操作后,x86/x64平台应该能正常编译通过并调用UWP设备信息API了。
内容的提问来源于stack exchange,提问作者Cobra91151
相关产品推荐
相关产品推荐

