通用 Windows 平台 (UWP)
三元组
kmpkg 内置了用于通过 MSVC cl.exe 编译器构建通用 Windows 平台(UWP)应用的三元组。
| 架构 | kmpkg 三元组 | 社区维护 |
|---|---|---|
| x64 | x64-uwp | |
| x64-uwp-static-md | 是 | |
| x86 | x86-uwp | 是 |
| x86-uwp-static-md | 是 | |
| arm | arm-uwp | |
| arm-uwp-static-md | 是 | |
| arm64 | arm64-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()