【CMake】Visual Studio Generatorsで.NET Framework/Core向けプロジェクトを構築: CMAKE_VS_TARGET_FRAMEWORK_IDENTIFIER徹底解説
"CMAKE_VS_TARGET_FRAMEWORK_IDENTIFIER" は、CMake 3.22 以降で導入された変数です。Visual Studio Generators が .csproj ファイルの "MSBuild TargetFrameworkIdentifier" 設定に明示的な値を設定する場合に、CMake が選択した値を保持します。これは、.NET Framework または .NET Core 向けのプロジェクトを構築する場合に役立ちます。
用途
"CMAKE_VS_TARGET_FRAMEWORK_IDENTIFIER" 変数は、以下の目的で使用できます。
- ターゲット フレームワークに依存するライブラリをリンクする
- 適切なコンパイラおよびリンカーオプションを設定する
- ターゲット フレームワークのバージョンを確認する
設定方法
"CMAKE_VS_TARGET_FRAMEWORK_IDENTIFIER" 変数は、CMakeLists.txt ファイル内で設定できます。例えば、以下のように設定できます。
set(CMAKE_VS_TARGET_FRAMEWORK_IDENTIFIER v4.0)
この例では、ターゲット フレームワークを .NET Framework 4.0 に設定しています。
使用例
以下の例は、"CMAKE_VS_TARGET_FRAMEWORK_IDENTIFIER" 変数を使用して、ターゲット フレームワークのバージョンを確認する方法を示しています。
message(STATUS "Target framework identifier: ${CMAKE_VS_TARGET_FRAMEWORK_IDENTIFIER}")
この例は、以下の出力を生成します。
Target framework identifier: v4.0
関連変数
"CMAKE_VS_TARGET_FRAMEWORK_IDENTIFIER" 変数に関連する他の変数として、以下のものがあります。
- CMAKE_VS_TARGET_FRAMEWORK_TARGETS_VERSION: ターゲット フレームワーク ターゲットのバージョン (例: "10.0.19041.0")
- CMAKE_VS_TARGET_FRAMEWORK_VERSION: ターゲット フレームワークのバージョン (例: "4.0")
- .NET Framework または .NET Core 以外のターゲット フレームワークを使用している場合は、この変数は使用できません。
- "CMAKE_VS_TARGET_FRAMEWORK_IDENTIFIER" 変数は、Visual Studio Generators を使用する場合にのみ使用できます。
cmake_minimum_required(VERSION 3.22)
project(MyProject)
set(CMAKE_VS_TARGET_FRAMEWORK_IDENTIFIER v4.0)
message(STATUS "Target framework identifier: ${CMAKE_VS_TARGET_FRAMEWORK_IDENTIFIER}")
Target framework identifier: v4.0
例 2: 適切なコンパイラおよびリンカーオプションを設定する
cmake_minimum_required(VERSION 3.22)
project(MyProject)
set(CMAKE_VS_TARGET_FRAMEWORK_IDENTIFIER v4.0)
if(CMAKE_VS_TARGET_FRAMEWORK_IDENTIFIER STREQUAL "v4.0")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++14")
set(CMAKE_LINK_FLAGS "${CMAKE_LINK_FLAGS} /SAFESEH")
endif()
add_executable(MyTarget MySource.cpp)
この例では、ターゲット フレームワークが .NET Framework 4.0 の場合、C++14 標準ライブラリと SAFESEH 例外処理を使用するようにコンパイラおよびリンカーオプションを設定します。
例 3: ターゲット フレームワークに依存するライブラリをリンクする
cmake_minimum_required(VERSION 3.22)
project(MyProject)
set(CMAKE_VS_TARGET_FRAMEWORK_IDENTIFIER v4.0)
if(CMAKE_VS_TARGET_FRAMEWORK_IDENTIFIER STREQUAL "v4.0")
target_link_libraries(MyTarget System.Windows.Forms)
endif()
add_executable(MyTarget MySource.cpp)
この例では、ターゲット フレームワークが .NET Framework 4.0 の場合、System.Windows.Forms
アセンブリをターゲットにリンクします。
- .NET Framework または .NET Core 以外のターゲット フレームワークを使用している場合は、この変数は使用できません。
- "CMAKE_VS_TARGET_FRAMEWORK_IDENTIFIER" 変数は、Visual Studio Generators を使用する場合にのみ使用できます。
- 上記の例はあくまでサンプルであり、実際のプロジェクトでは状況に応じて変更する必要があります。
プロジェクト ファイル (.csproj) を直接編集する
最も単純な方法は、プロジェクト ファイル (.csproj) を直接編集して、"TargetFramework" 属性を設定することです。これは、Visual Studio またはテキスト エディタを使用して行うことができます。
<Project>
<PropertyGroup>
<TargetFramework>v4.0</TargetFramework>
</PropertyGroup>
</Project>
"TargetFramework" プロパティを設定する CMake プロパティを使用する
CMake には、"TargetFramework" プロパティを設定するためのプロパティがいくつか用意されています。これらのプロパティは、CMakeLists.txt ファイル内で使用できます。
- CMAKE_FRAMEWORK_TARGET_DIR: ターゲット フレームワークのディレクトリ (例: "C:\Program Files (x86)\Microsoft .NET Framework\v4.0")
- CMAKE_FRAMEWORK_TARGET_VERSION: ターゲット フレームワークのバージョン (例: "4.0")
set(CMAKE_FRAMEWORK_TARGET_VERSION 4.0)
"dotnet" モジュールを使用する
"dotnet" モジュールは、CMake 3.17 以降で導入されたモジュールです。このモジュールを使用して、.NET プロジェクトを構築および管理することができます。
use_module(dotnet)
dotnet_add_project(MyProject MyProject.csproj)
Visual Studio Tools for CMake を使用する
Visual Studio Tools for CMake は、Visual Studio に CMake の統合機能を提供する拡張機能です。この拡張機能を使用して、プロジェクト ファイル (.csproj) を生成および編集することができます。
- .NET Framework または .NET Core 以外のターゲット フレームワークを使用している場合は、この変数は使用できません。
- "CMAKE_VS_TARGET_FRAMEWORK_IDENTIFIER" 変数は、Visual Studio Generators を使用する場合にのみ使用できます。
- プロジェクトの要件に応じて、最適な方法を選択してください。
- 上記の代替方法は、それぞれ長所と短所があります。