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. 先跑个最小测试项目排除干扰
如果还是卡壳,建议先做个最小可运行测试,排除其他代码的影响:
- 在Qt Creator里新建「Qt Widgets Application」,选择UWP 64bit套件
- 把上面的.pro配置复制进去,调整路径
- 下载对应版本的cppwinrt放到项目目录
- 把上面的main.cpp代码替换进去
- 运行qmake→构建→运行,看是否能正常弹出WinRT的弹窗
内容的提问来源于stack exchange,提问作者Paweł Skorupiński
相关产品推荐
相关产品推荐

