CMake: VS_WINDOWS_TARGET_PLATFORM_MIN_VERSIONでWindowsアプリ開発をレベルアップ

2024-06-29

CMake の "Properties: Targets" における "VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION" プロパティ

"VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION" プロパティは、CMake で生成される Visual Studio プロジェクトにおいて、ターゲットが最低限動作する Windows オペレーティングシステム (OS) のバージョンを指定するために使用されます。これは、"Properties: Targets" カテゴリに属するターゲット プロパティの一つです。

用途

このプロパティを設定することで、以下の利点が得られます。

  • 互換性の向上: アプリケーションが古いバージョンの Windows で実行されないことを防ぎ、ユーザーにとってより幅広い互換性を確保できます。
  • パフォーマンス向上: ターゲット OS に固有の機能を活用することで、パフォーマンスを向上させることができます。
  • デバッグの簡素化: 対象となる OS バージョンを明確にすることで、デバッグ作業を効率化できます。

設定方法

"VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION" プロパティは、ターゲットに対して以下の方法で設定できます。

  • target_properties() 関数を使用する:
target_properties(mytarget PROPERTIES VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION 10.0.19041.0)
  • CMakeLists.txt ファイル内で直接設定する:
set_target_properties(mytarget PROPERTIES VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION 10.0.19041.0)

使用例

以下の例は、Windows 10 バージョン 20H2 以降で動作するターゲット "mytarget" を定義する方法を示しています。

target_properties(mytarget PROPERTIES VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION 10.0.19041.0)

補足事項

  • "VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION" プロパティは、Visual Studio 2015 以降でのみサポートされています。
  • このプロパティを設定するには、Windows SDK がインストールされている必要があります。


    cmake_minimum_required(VERSION 3.15)
    
    project(myproject)
    
    set(CMAKE_VisualStudio_Compiler_CMakeListsTxtDir "${CMAKE_BINARY_DIR}/vcpkg-bin")
    
    add_executable(mytarget main.cpp)
    
    target_properties(mytarget PROPERTIES VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION 10.0.19041.0)
    

    例 2: 複数のターゲットに対して "VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION" プロパティを設定する

    cmake_minimum_required(VERSION 3.15)
    
    project(myproject)
    
    set(CMAKE_VisualStudio_Compiler_CMakeListsTxtDir "${CMAKE_BINARY_DIR}/vcpkg-bin")
    
    add_executable(mytarget1 main1.cpp)
    target_properties(mytarget1 PROPERTIES VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION 8.1.0.0)
    
    add_executable(mytarget2 main2.cpp)
    target_properties(mytarget2 PROPERTIES VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION 10.0.17763.0)
    

    例 3: "target_properties()" 関数を使用して "VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION" プロパティを設定する

    cmake_minimum_required(VERSION 3.15)
    
    project(myproject)
    
    set(CMAKE_VisualStudio_Compiler_CMakeListsTxtDir "${CMAKE_BINARY_DIR}/vcpkg-bin")
    
    add_executable(mytarget main.cpp)
    
    target_properties(mytarget PROPERTIES 
      VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION 10.0.19041.0
      CXX_STANDARD 17
    )
    

    説明

    上記の例では、以下の操作が行われています。

    • cmake_minimum_required() 関数を使用して、CMake の最低限必要なバージョンを指定します。
    • project() 関数を使用して、プロジェクトの名前を定義します。
    • set(CMAKE_VisualStudio_Compiler_CMakeListsTxtDir "${CMAKE_BINARY_DIR}/vcpkg-bin") コマンドを使用して、Visual Studio コンパイラ CMakeLists.txt ファイルの場所を指定します。
    • add_executable() 関数を使用して、実行可能ファイルターゲットを作成します。
    • target_properties() 関数を使用して、ターゲット "mytarget" に対して "VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION" プロパティを設定します。
    • 複数のターゲットに対して "VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION" プロパティを設定する方法を示します。
    • "target_properties()" 関数を使用して、ターゲット "mytarget" に対して "VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION" プロパティと C++ 標準バージョンを設定する方法を示します。


    "VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION" の代替方法

    代替方法

    • Windows SDK ヘッダーファイルのインクルード: ターゲットが特定の OS バージョンでしか利用できない機能を使用している場合は、その機能に対応する Windows SDK ヘッダーファイルを直接インクルードすることができます。
    • 条件付きコンパイル: 異なる OS バージョンで異なるコードをコンパイルする必要がある場合は、条件付きコンパイルを使用することができます。
    • Platform Toolset の指定: Visual Studio 2019 以降では、ターゲットごとに Platform Toolset を指定することで、OS 互換性を制御することができます。

    各方法の詳細

    Windows SDK ヘッダーファイルのインクルード

    特定の OS バージョンでしか利用できない機能を使用している場合は、その機能に対応する Windows SDK ヘッダーファイルを直接インクルードすることができます。これは、"VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION" プロパティよりも柔軟性があり、特定の機能のみを対象とした場合に有効です。

    :

    #ifdef _WIN32_WINNT_VISTA
    #include <WindowsVista.h>
    #else
    #include <WindowsXP.h>
    #endif
    

    条件付きコンパイル

    異なる OS バージョンで異なるコードをコンパイルする必要がある場合は、条件付きコンパイルを使用することができます。これは、"if" ステートメントを使用して、コンパイラが特定の OS バージョンでしか実行されないコードをコンパイルするかどうかを制御するものです。

    #ifdef _WIN32_WINNT_VISTA
    // Vista 以降のコード
    #else
    // XP 以前のコード
    #endif
    

    Platform Toolset の指定

    Visual Studio 2019 以降では、ターゲットごとに Platform Toolset を指定することで、OS 互換性を制御することができます。Platform Toolset は、コンパイラと標準ライブラリのバージョンを指定するものです。

    target_properties(mytarget PROPERTIES PLATFORM_TOOLSET v142)
    

    "VS_WINDOWS_TARGET_PLATFORM_MIN_VERSION" プロパティは、CMake で生成される Visual Studio プロジェクトにおいて、ターゲットの OS 互換性を制御するための便利なツールですが、状況によっては、より柔軟性のある代替方法を使用することがあります。