You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Qt 5.9.2 UWP应用用VS2017编译器+C++17调用WinRT API编译报错求助

我来帮你搞定Qt 5.9.2 UWP项目调用WinRT API的编译问题,结合你的环境(MSVC2017 v15.5.7 + Win10),咱们一步步排查解决:

1. 先检查.pro文件的关键配置是否到位

Qt UWP项目要启用WinRT支持,必须在.pro里加对配置项,少一个都可能出问题:

  • 明确启用UWP模式:CONFIG += windows uwp
  • 定义UWP专属宏:DEFINES += WINAPI_FAMILY=WINAPI_FAMILY_APP,这个宏是区分UWP和桌面应用的核心,很多WinRT API依赖它才会暴露
  • 添加cppwinrt头文件路径:比如你把cppwinrt放在项目根目录的cppwinrt文件夹下,就加INCLUDEPATH += $$PWD/cppwinrt/include
  • 链接WinRT基础依赖库:LIBS += -lole32 -loleaut32 -luuid,这些是WinRT COM交互的必备库

给你一个参考的.pro片段:

QT += core gui widgets

TARGET = UWPWinRTTest
TEMPLATE = app

# 启用UWP模式
CONFIG += windows uwp
# 声明UWP应用身份
DEFINES += WINAPI_FAMILY=WINAPI_FAMILY_APP

# cppwinrt头文件路径,根据你的实际存放位置调整
INCLUDEPATH += $$PWD/cppwinrt/include

# WinRT基础依赖库
LIBS += -lole32 -loleaut32 -luuid

SOURCES += main.cpp \
    mainwindow.cpp

HEADERS += mainwindow.h
2. 确认cppwinrt版本和环境兼容

Qt5.9.2是2017年的老版本,而cppwinrt一直在迭代更新,你从GitHub拉的最新版大概率和MSVC2017 v15.5.7不兼容。建议你下载和VS2017 v15.5.7匹配的cppwinrt版本——VS2017 v15.5对应的Windows SDK版本是10.0.16299.0(Fall Creators Update),找对应这个SDK版本的cppwinrt包就行。

另外,cppwinrt的初始化和使用要规范:

#include <QApplication>
#include <winrt/Windows.Foundation.h>
#include <winrt/Windows.UI.Popups.h>

// 引入cppwinrt命名空间,简化代码
using namespace winrt;
using namespace Windows::UI::Popups;

int main(int argc, char *argv[])
{
    // 必须先初始化cppwinrt的COM公寓
    init_apartment();

    QApplication app(argc, argv);
    // ... 你的UI代码

    // 测试WinRT API:显示一个弹窗
    MessageDialog dialog(L"Hello from WinRT!", L"Qt UWP Test");
    dialog.ShowAsync().get();

    return app.exec();
}
3. 检查编译环境的SDK配置是否匹配

Qt的UWP套件必须依赖对应版本的Windows 10 SDK,你需要确认:

  • VS Build Tool 2017已经安装了Windows 10 SDK 10.0.16299.0或相近版本(不要用太新的SDK,Qt5.9.2对新SDK支持有限)
  • 在Qt Creator的「工具」->「选项」->「构建和运行」->「套件」里,选中你的UWP 64bit套件,检查「编译器」是否指向MSVC2017 64bit,「SDK」是否关联到正确的Windows 10 SDK版本
  • 可以打开VS2017的开发者命令提示符,运行set WindowsSDKVersion,确认输出的版本和Qt套件配置的一致
4. 常见编译错误的排查方向

如果报错是「找不到WinRT头文件」或「标识符未定义」:

  • 检查WINAPI_FAMILY宏是否正确定义,没有这个宏的话,WinRT头文件会默认隐藏UWP专属API
  • 确认cppwinrt的头文件路径是否正确添加到INCLUDEPATH,Qt Creator里右键项目→「运行qmake」,看头文件有没有红色波浪线
  • 检查代码里是否正确引入了cppwinrt的命名空间,比如有没有using namespace winrt;或者用winrt::前缀

如果是链接错误:

  • 确认LIBS里已经加了-lole32 -loleaut32 -luuid这三个基础库
  • 检查Qt套件是否选择了UWP 64bit目标平台,别选错成桌面版MSVC了
5. 先跑个最小测试项目排除干扰

如果还是卡壳,建议先做个最小可运行测试,排除其他代码的影响:

  1. 在Qt Creator里新建「Qt Widgets Application」,选择UWP 64bit套件
  2. 把上面的.pro配置复制进去,调整路径
  3. 下载对应版本的cppwinrt放到项目目录
  4. 把上面的main.cpp代码替换进去
  5. 运行qmake→构建→运行,看是否能正常弹出WinRT的弹窗

内容的提问来源于stack exchange,提问作者Paweł Skorupiński

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:00:06