MSVC を使用した Windows
vcpkg には、MSVC cl.exe
コンパイラを使用して Windows デスクトップ アプリケーションをビルドするためのtripletsが含まれています。
Architecture | vcpkg triplets | コミュニティ |
---|---|---|
x64 | x64-windows | |
x64-windows-release | はい | |
x64-windows-static | ||
x64-windows-static-md | はい | |
x64-windows-static-release | はい | |
x86 | x86-windows | |
x86-windows-static | はい | |
x86-windows-static-md | はい | |
arm | arm-windows | はい |
arm-windows-static | はい | |
arm64 | arm64-windows | |
arm64-windows-static | はい | |
arm64-windows-static-md | はい | |
arm64-windows-static-release | はい | |
arm64ec | arm64ec-windows | はい |
static
リンクトリプレットは、MSVC ランタイムをスタティック ライブラリ (つまり、VCPKG_CRT_LINKAGE static
) として使用するように設定されます。
static-md
リンクトリプレットは、MSVC ランタイムを DLL (つまり、VCPKG_CRT_LINKAGE dynamic
) として使用するように設定されます。 これは、 Microsoft Learn ごとに MSVC ランタイムを再配布するための推奨ソリューションです。
既定では、vcpkg は、コードをビルドするためにシステムにインストールされている最新バージョンの Visual Studio を使用します。 特定のバージョンを選択するには、カスタムのトリプレットオーバーレイまたはトリプレットオーバーレイを作成して VCPKG_PLATFORM_TOOLSET
を設定します。
たとえば、これにより Visual Studio 2017 ツールセットが強制的に使用されます。
set(VCPKG_PLATFORM_TOOLSET v141)
Microsoft Visual C/C++ ランタイムは、"前方バイナリ互換" です。 つまり、Visual Studio 2015 Update 3、Visual Studio 2017、Visual Studio 2019、Visual Studio 2022 を使用してコードをビルドし、すべてをリンクできます。 重要な要件は、ミックス内の newest ツールセットに対して LINK を実行する必要があるということです。 Microsoft Learn を参照してください。
これらのトリプレットの CMake プロジェクトは、"Windows" に設定 CMAKE_SYSTEM_NAME
使用してビルドされます。
- "マイ コードのみ" デバッグは、通常、コード領域を節約するためにライブラリで無効にすることができます。
if(MSVC)
target_compile_options(mytarget PRIVATE /JMC-)
endif()
- MSBuild では、MSVC コンパイラ自体で既定でオンにされていないビルド フラグが自動的に追加されます。 Ninja またはその他のジェネレーターと同じ動作を確認するには、これらのビルド設定を追加します。
if(MSVC)
target_compile_options(mytarget PRIVATE /Zc:inline)
endif()
- 新しいバージョンの MSVC に推奨されるビルド設定は、コード セキュリティを強化するために推奨されます。
if(MSVC)
target_compile_options(mytarget PRIVATE "$<$<NOT:$<CONFIG:DEBUG>>:/guard:cf>")
target_link_options(mytarget PRIVATE /DYNAMICBASE /NXCOMPAT)
if((CMAKE_SIZEOF_VOID_P EQUAL 4)
AND (NOT (${VCPKG_TARGET_ARCHITECTURE} MATCHES "^arm")))
target_link_options(mytarget PRIVATE /SAFESEH)
endif()
if((MSVC_VERSION GREATER_EQUAL 1928)
AND (CMAKE_SIZEOF_VOID_P EQUAL 8)
AND ((NOT (CMAKE_CXX_COMPILER_ID MATCHES "Clang"))
OR (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 13.0)))
target_compile_options(mytarget PRIVATE "$<$<NOT:$<CONFIG:DEBUG>>:/guard:ehcont>")
target_link_options(mytarget PRIVATE "$<$<NOT:$<CONFIG:DEBUG>>:/guard:ehcont>")
endif()
endif()
if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
target_compile_options(mytarget PRIVATE /sdl)
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.24)
target_compile_options(mytarget PRIVATE /ZH:SHA_256)
endif()
if((CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.27)
AND (NOT (${VCPKG_TARGET_ARCHITECTURE} MATCHES "^arm")))
target_link_options(mytarget PRIVATE /CETCOMPAT)
endif()
endif()
- Standard C/C++ 準拠を改善するには、最新のスイッチ設定を使用します。
if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
target_compile_options(mytarget PRIVATE /permissive- /Zc:__cplusplus /Zc:inline)
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.26)
target_compile_options(mytarget PRIVATE /Zc:preprocessor)
endif()
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.28)
target_compile_options(mytarget PRIVATE /Zc:lambda)
endif()
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.35)
target_compile_options(mytarget PRIVATE /Zc:templateScope)
endif()
endif()
- プログラム全体の最適化/リンク時コード生成の使用をサポートするために、推奨されるビルド設定は次のとおりです。
if((CMAKE_CXX_COMPILER_ID MATCHES "MSVC") AND CMAKE_INTERPROCEDURAL_OPTIMIZATION)
target_compile_options(${PROJECT_NAME} PRIVATE /Gy /Gw)
if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.35)
target_compile_options(mytarget PRIVATE /Zc:checkGwOdr)
endif()
endif()
- Spectre の軽減策を有効にする場合は、次のガードを使用します。
if(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
if((MSVC_VERSION GREATER_EQUAL 1913) AND (NOT WINDOWS_STORE))
target_compile_options(mytarget PRIVATE "/Qspectre")
endif()
endif()
また、これを制御するための明示的な CMake ビルド オプションを指定することもできます。
Microsoft Learn を参照してください。
vcpkg に関するフィードバック
vcpkg はオープンソース プロジェクトです。 フィードバックを提供するにはリンクを選択します。