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