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


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

用途

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

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

設定方法

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


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
)

説明

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

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


代替方法

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

各方法の詳細

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 互換性を制御するための便利なツールですが、状況によっては、より柔軟性のある代替方法を使用することがあります。