英語で読む

次の方法で共有


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 ランタイムを再配布するための推奨ソリューションです。

MSVC ツールセットの選択

既定では、vcpkg は、コードをビルドするためにシステムにインストールされている最新バージョンの Visual Studio を使用します。 特定のバージョンを選択するには、カスタムのトリプレットオーバーレイまたはトリプレットオーバーレイを作成して VCPKG_PLATFORM_TOOLSETを設定します。

たとえば、これにより Visual Studio 2017 ツールセットが強制的に使用されます。

set(VCPKG_PLATFORM_TOOLSET v141)

C/C++ ランタイムの互換性

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 を参照してください。