Lire en anglais

Partager via


Windows avec MSVC

Triplés

vcpkg inclut des triplets pour la création d’applications de bureau Windows à l’aide du compilateur MSVC cl.exe .

Architecture triplets vcpkg Community
x64 x64-windows
x64-windows-release Oui
x64-windows-static
x64-windows-static-md Oui
x64-windows-static-release Oui
x86 x86-windows
x86-windows-static Oui
x86-windows-static-md Oui
arm arm-windows Oui
arm-windows-static Oui
arm64 arm64-windows
arm64-windows-static Oui
arm64-windows-static-md Oui
arm64-windows-static-release Oui
arm64ec arm64ec-windows Oui

Les static triplets de liaison sont définis pour utiliser le runtime MSVC en tant que bibliothèque statique (par exemple VCPKG_CRT_LINKAGE static).

Les static-md triplets de liaison sont définis pour utiliser le runtime MSVC en tant que DLL (par exemple). VCPKG_CRT_LINKAGE dynamic Il s’agit de la solution recommandée pour redistribuer le runtime MSVC par Microsoft Learn.

Sélection d’un ensemble d’outils MSVC

Par défaut, vcpkg utilise la dernière version de Visual Studio installée sur le système pour générer du code. Pour sélectionner une version spécifique, créez une superposition de triplet ou triplet personnalisée à définir VCPKG_PLATFORM_TOOLSET.

Par exemple, cela force l’utilisation de l’ensemble d’outils Visual Studio 2017.

set(VCPKG_PLATFORM_TOOLSET v141)

Compatibilité du runtime C/C++

Le runtime Microsoft Visual C/C++ est « compatible binaire avant ». Cela signifie que vous pouvez générer du code avec Visual Studio 2015 Update 3, Visual Studio 2017, Visual Studio 2019 et/ou Visual Studio 2022 et le lier ensemble. L’exigence clé est que le LIEN doit être effectué par rapport au jeu d’outils le plus récent de la combinaison. Consultez Microsoft Learn.

Notes de maintenance

Les projets CMake pour ces triplets sont générés à l’aide de CMAKE_SYSTEM_NAME la valeur « Windows ».

Notes d’auteur de bibliothèque

  • Le débogage « Juste mon code » peut généralement être désactivé dans une bibliothèque pour économiser de l’espace de code.
if(MSVC)
    target_compile_options(mytarget PRIVATE /JMC-)
endif()
  • MSBuild ajoute automatiquement certains indicateurs de build qui ne sont pas activés par défaut dans le compilateur MSVC lui-même. Pour garantir le même comportement avec Ninja ou d’autres générateurs, ajoutez ces paramètres de build.
if(MSVC)
    target_compile_options(mytarget PRIVATE /Zc:inline)
endif()
  • Les paramètres de build recommandés pour les versions plus récentes de MSVC sont encouragés à améliorer la sécurité du code.
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()
  • Pour améliorer la conformité standard C/C++, utilisez les derniers paramètres de commutateur.
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()
  • Pour prendre en charge l’utilisation de toute l’optimisation du programme / génération de code au moment du lien, les paramètres de build recommandés sont les suivants :
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()
  • Si vous activez les atténuations de Spectre, utilisez les gardes suivants.
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()

Notez que vous souhaiterez peut-être également fournir une option de build CMake explicite pour contrôler cela également.

Consultez Microsoft Learn.