CMakeでWindows 10 SDKをターゲットとする:CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION詳解


CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION は、CMake プロジェクトで Visual Studio 2015 以降 を使用して Windows 10 以降 をターゲットとする際に、使用する Windows SDK のバージョンを指定 するための変数です。

機能

この変数は、以下の機能を提供します。

  • Windows 10 SDK のカスタムパス指定
    CMAKE_WINDOWS_KITS_10_DIR 環境変数を設定することで、CMake に Windows 10 SDK のカスタムパスを指定することができます。
  • DirectX コンポーネントの検索
    一部のプロジェクトでは、DirectX コンポーネントをビルドするために特定の Windows SDK バージョンが必要となります。 CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION を設定することで、これらのコンポーネントを適切な場所で見つけることができます。
  • 適切な Windows SDK の選択
    指定された Windows ターゲットバージョンに基づいて、CMake は適切な Windows SDK を選択します。

設定方法

CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION 変数は、CMake プロジェクトの CMakeLists.txt ファイル内で設定できます。 例は以下の通りです。

set(CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION 10.0.19041.0)

上記の例では、CMake は Windows 10 バージョン 19041.0 をターゲットとする Windows SDK を選択します。

  • CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION 変数は、CMAKE_SYSTEM_VERSION 変数よりも優先されます。
  • Windows ターゲットバージョンを指定していない場合、CMake は 最新のバージョンの Windows SDK を選択します。
  • CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION 変数は、Visual Studio 2015 以降でのみ使用できます。

以下の例は、CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION 変数を使用して、Windows 10 バージョン 19041.0 をターゲットとするプロジェクトをビルドする方法を示しています。

set(CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION 10.0.19041.0)

project(myproject)

add_executable(myprogram main.cpp)


CMakeLists.txt

cmake_minimum_required(VERSION 3.10)

project(myproject)

set(CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION 10.0.19041.0)

add_executable(myprogram main.cpp)

main.cpp

#include <iostream>

int main() {
  std::cout << "Hello, World!" << std::endl;
  return 0;
}

ビルドと実行

以下のコマンドを実行して、プロジェクトをビルドして実行します。

mkdir build
cd build
cmake ..
cmake --build .
./myprogram

このコードを実行すると、以下の出力がコンソールに表示されます。

Hello, World!

説明

  • add_executable(myprogram main.cpp): この行は、main.cpp ファイルから myprogram という名前の実行可能ファイルを作成することを CMake に指示します。
  • set(CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION 10.0.19041.0): この行は、CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION 変数を Windows 10 バージョン 19041.0 に設定します。
  • project(myproject): この行は、プロジェクトの名前を myproject に設定します。
  • cmake_minimum_required(VERSION 3.10): この行は、CMake 3.10 以降が必要であることを指定します。

以下の例は、CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION 変数を使用して、異なるバージョンの Windows をターゲットとするプロジェクトをビルドする方法を示しています。

  • Windows 8.1 をターゲットとする
set(CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION 8.1.0)
  • Windows 7 をターゲットとする
set(CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION 7.0.0)


CMAKE_SYSTEM_VERSION 変数を使用する

CMAKE_SYSTEM_VERSION 変数は、CMake プロジェクトでターゲットとするオペレーティングシステムのバージョンを指定するために使用されます。 この変数は、CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION 変数よりも優先的に使用されます。

以下の例は、CMAKE_SYSTEM_VERSION 変数を使用して Windows 10 バージョン 19041.0 をターゲットとするプロジェクトをビルドする方法を示しています。

cmake_minimum_required(VERSION 3.10)

project(myproject)

set(CMAKE_SYSTEM_VERSION 10.0.19041.0)

add_executable(myprogram main.cpp)

CMAKE_MINIMUM_REQUIRED_VERSION と CMAKE_MAXIMUM_REQUIRED_VERSION 変数を使用する

CMAKE_MINIMUM_REQUIRED_VERSIONCMAKE_MAXIMUM_REQUIRED_VERSION 変数は、CMake プロジェクトでターゲットとするオペレーティングシステムの最小バージョンと最大バージョンを指定するために使用されます。

以下の例は、CMAKE_MINIMUM_REQUIRED_VERSIONCMAKE_MAXIMUM_REQUIRED_VERSION 変数を使用して Windows 10 バージョン 19041.0 をターゲットとするプロジェクトをビルドする方法を示しています。

cmake_minimum_required(VERSION 10.0.19041.0)
cmake_maximum_required(VERSION 10.0.19041.0)

project(myproject)

add_executable(myprogram main.cpp)

target_link_libraries コマンドを使用して Windows SDK を明示的にリンクする

target_link_libraries コマンドを使用して、プロジェクトに必要な Windows SDK ライブラリを明示的にリンクすることができます。

以下の例は、target_link_libraries コマンドを使用して Windows 10 バージョン 19041.0 SDK をリンクする方法を示しています。

cmake_minimum_required(VERSION 3.10)

project(myproject)

add_executable(myprogram main.cpp)

target_link_libraries(myprogram ${CMAKE_CURRENT_BINARY_DIR}/lib/user32.lib ${CMAKE_CURRENT_BINARY_DIR}/lib/gdi32.lib ${CMAKE_CURRENT_BINARY_DIR}/lib/imm32.lib ${CMAKE_CURRENT_BINARY_DIR}/lib/ole32.lib ${CMAKE_CURRENT_BINARY_DIR}/lib/shell32.lib ${CMAKE_CURRENT_BINARY_DIR}/lib/comdlg32.lib ${CMAKE_CURRENT_BINARY_DIR}/lib/advapi32.lib ${CMAKE_CURRENT_BINARY_DIR}/lib/shlwapi.lib)
  • 特定のプロジェクトの要件に応じて、どの方法が最適かは異なります。
  • 上記の代替方法は、すべての状況で CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION 変数の代わりとなるわけではありません。