Leer en inglés

Compartir a través de


Windows con MSVC

Trillizos

vcpkg incluye tripletos para compilar aplicaciones de escritorio de Windows mediante el compilador de MSVC cl.exe .

Arquitectura Triplets vcpkg Comunidad
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

Los static tripletes de vinculación se establecen para usar el entorno de ejecución de MSVC como una biblioteca estática (es decir, VCPKG_CRT_LINKAGE static).

Los static-md tripletes de vinculación se establecen para usar el entorno de ejecución de MSVC como un archivo DLL (es decir, VCPKG_CRT_LINKAGE dynamic). Esta es la solución recomendada para redistribuir el entorno de ejecución de MSVC por Microsoft Learn.

Selección de un conjunto de herramientas de MSVC

De forma predeterminada, vcpkg usará la versión más reciente de Visual Studio instalada en el sistema para compilar código. Para seleccionar una versión específica, cree una superposición triple o triplet personalizada para establecer VCPKG_PLATFORM_TOOLSET.

Por ejemplo, esto forzaría el uso del conjunto de herramientas de Visual Studio 2017.

set(VCPKG_PLATFORM_TOOLSET v141)

Compatibilidad con el entorno de ejecución de C/C++

El entorno de ejecución de Microsoft Visual C/C++ es "compatible con binarios reenviar". Esto significa que puede compilar código con Visual Studio 2015 Update 3, Visual Studio 2017, Visual Studio 2019 o Visual Studio 2022 y vincularlo todos juntos. El requisito clave es que link debe realizarse con el conjunto de herramientas más reciente de la combinación. Consulte Microsoft Learn.

Notas del mantenedor

Los proyectos de CMake para estos tripletos se compilan con CMAKE_SYSTEM_NAME establecido en "Windows".

Notas del autor de la biblioteca

  • Normalmente, la depuración "Solo mi código" se puede deshabilitar en una biblioteca para ahorrar espacio en código.
if(MSVC)
    target_compile_options(mytarget PRIVATE /JMC-)
endif()
  • MSBuild agregará automáticamente algunas marcas de compilación que no están activadas de forma predeterminada en el propio compilador de MSVC. Para garantizar el mismo comportamiento con Ninja u otros generadores, agregue esta configuración de compilación.
if(MSVC)
    target_compile_options(mytarget PRIVATE /Zc:inline)
endif()
  • Se recomienda la configuración de compilación recomendada para las versiones más recientes de MSVC para mejorar la seguridad del código.
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()
  • Para mejorar la conformidad de C/C++ estándar, use la configuración de conmutador más reciente.
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()
  • Para admitir el uso de la optimización de todo el programa/generación de código en tiempo de vínculo, la configuración de compilación recomendada es la siguiente:
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 habilita las mitigaciones de Spectre, use los siguientes guardias.
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()

Tenga en cuenta que también puede proporcionar una opción de compilación explícita de CMake para controlar esto también.

Consulte Microsoft Learn.