跳到主要内容

通用 Windows 平台 (UWP)

三元组

kmpkg 内置了用于通过 MSVC cl.exe 编译器构建通用 Windows 平台(UWP)应用的三元组

架构kmpkg 三元组社区维护
x64x64-uwp
x64-uwp-static-md
x86x86-uwp
x86-uwp-static-md
armarm-uwp
arm-uwp-static-md
arm64arm64-uwp
arm64-uwp-static-md

维护者注意事项

为这些三元组构建 CMake 项目时,CMAKE_SYSTEM_NAME 会设为 "WindowsStore",CMAKE_SYSTEM_VERSION 设为 "10.0"。

UWP 三元组还会通过 /DWINAPI_FAMILY=WINAPI_FAMILY_APP 编译代码(用于指定 API 分区),因此如果库使用了 UWP 不支持的 Win32 API 版本,可能会编译失败。通用建议是尽可能使用较新的 API;但如果需要为旧版 Windows 编译同一库,需通过如下所示的条件编译代码兼容两种场景:

    HANDLE hFile = nullptr;
#if (_WIN32_WINNT >= _WIN32_WINNT_WIN8)
hFile = CreateFile2(
fileName,
GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING,
nullptr);
#else
hFile = CreateFileW(
fileName,
GENERIC_READ, FILE_SHARE_READ,
nullptr,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL,
nullptr);
#endif

UWP 三元组还会启用 /DUNICODE /D_UNICODE 编译选项——这是现代开发的强推荐配置。更多信息可参考 UTF-8 Everywhere 宣言

库作者注意事项

对于 CMake 3.1 及更高版本,可通过 Visual Studio 生成器VS_WINRT_COMPONENT 属性控制 MSVC C++/CX 语言扩展(即 /ZW 选项)的启用状态。

若使用 C++/WinRT 语言投影,建议使用 kmpkg 的 cppwinrt 端口,而非依赖 Windows SDK 中通常较旧的头文件:

if (KMPKG_TOOLCHAIN)
message(STATUS "使用 KMPKG 提供的 C++/WinRT。")
find_package(cppwinrt CONFIG REQUIRED)
target_link_libraries(${PROJECT_NAME} PRIVATE Microsoft::CppWinRT)
endif()

CMakeLists.txt 文件中,需添加类似以下的代码为 UWP 平台启用正确的构建配置(这些配置不会被 CMake 自动设置):

if(WIN32)
target_compile_definitions(${PROJECT_NAME} PRIVATE _UNICODE UNICODE)

if(WINDOWS_STORE)
target_compile_definitions(${PROJECT_NAME} PRIVATE WINAPI_FAMILY=WINAPI_FAMILY_APP)
endif()
endif()

此外,建议为所有 WIN32 平台(至少为 WINDOWS_STORE 平台构建)设置 _WIN32_WINNT=0x0A00(对应 Windows 10 及更高版本):

if(WIN32)
target_compile_definitions(${PROJECT_NAME} PRIVATE _WIN32_WINNT=0x0A00)
endif()