英語で読む

次の方法で共有


ユニバーサル Windows プラットフォーム (UWP)

三つ子

vcpkg には、MSVC cl.exe コンパイラを使用してユニバーサル Windows プラットフォーム (UWP) アプリケーションをビルドするためのtripletsが含まれています。

Architecture vcpkg triplets コミュニティ
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 はい

C++/CX と C++/WinRT プロジェクション

UWP アプリケーションは通常、Windows ランタイム API を使用します。C++ からこれらを使用するためのソリューションは多数あります。 C++/CX 言語拡張 MSVC コンパイラ (/ZW)、C++/WinRT 言語プロジェクション C++17 コンパイラ、または Windows ランタイム ライブラリで動作します

UWP トリプレット ツールチェーンでは、C++/CX 言語拡張 (/ZW) を CMake まで有効にできますが、使用するツールセットの適切なplatform.winmd ファイルを指す/FU パラメーターが提供されます。

メンテナーの注意事項

これらのトリプレットの 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 Everywhere マニフェスト を参照してください。

ライブラリ作成者のノート

CMake 3.1 以降では、Visual Studio ジェネレーターのVS_WINRT_COMPONENT プロパティを使用して、MSVC C++/CX 言語拡張 (つまり/ZW) の有効化を制御

C++/WinRT 言語プロジェクションを利用する場合Windows SDK の古いヘッダーに依存するのではなく、cppwinrt vcpkg ポートを活用します。

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 ファイルでは、CMake によって自動的に設定されないため、UWP プラットフォームの適切なビルド設定を有効にするには、次のようなものを使用します。

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_WINNT=0x0A00 (Windows 10 以降) と、すべてのWIN32 プラットフォーム、または少なくともWINDOWS_STORE プラットフォーム ビルドに対して設定する必要があります。

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

参考資料