閱讀英文

共用方式為


通用 Windows 平台 (UWP)

三胞 胎

vcpkg 包含三重組件,可用於使用 MSVC cl.exe 編譯程式建置 通用 Windows 平台 (UWP) 應用程式。

架構 vcpkg triplets 社群
x64 x64-uwp
x64-uwp-static-md Yes
x86 x86-uwp Yes
x86-uwp-static-md Yes
arm arm-uwp
arm-uwp-static-md Yes
arm64 arm64-uwp Yes
arm64-uwp-static-md Yes

C++/CX 與 C++/WinRT 投影

UWP 應用程式通常會取用 Windows 執行階段 API,而且有許多解決方案可從C++使用這些解決方案。 MSVC 編譯程式的C++/CX 語言延伸模組、/ZW適用於 C++17 編譯程式或 Windows 執行階段 連結庫的 C++/WinRT 語言投影。

UWP 三重項工具鏈會保留啟用 CMake 的C++/CX 語言延伸模組(/ZW),但會提供 /FU 參數來指向所使用工具組的適當 platform.winmd 檔案。

維護者附注

這些三胞胎的 CMake 專案是使用 CMAKE_SYSTEM_NAME 設定為 「WindowsStore」 建置,並 CMAKE_SYSTEM_VERSION 設定為 「10.0」。。

UWP 三胞胎也會使用 來建置 API 分割區的程式代碼 /DWINAPI_FAMILY=WINAPI_FAMILY_APP ,因此如果連結庫使用不支援的 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隨處宣言

連結庫作者筆記

針對 CMake 3.1 或更新版本,您可以透過 VS_WINRT_COMPONENT Visual Studio 產生器的 屬性來控制 MSVC C++/CX 語言延伸模組的/ZW啟用。

如果使用C++/WinRT 語言投影,請利用 cppwinrt vcpkg 埠,而不是依賴 Windows SDK 中經常過期的標頭。

if (VCPKG_TOOLCHAIN)
    message(STATUS "Using VCPKG for 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平台設定 _WIN32_WINNT=0x0A00 (Windows 10 或更新版本),或至少針對WINDOWS_STORE平台組建。

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

進一步閱讀