Windows con MSVC
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 | Sí | |
x64-windows-static | ||
x64-windows-static-md | Sí | |
x64-windows-static-release | Sí | |
x86 | x86-windows | |
x86-windows-static | Sí | |
x86-windows-static-md | Sí | |
ARM | arm-windows | Sí |
arm-windows-static | Sí | |
ARM64 | arm64-windows | |
arm64-windows-static | Sí | |
arm64-windows-static-md | Sí | |
arm64-windows-static-release | Sí | |
arm64ec | arm64ec-windows | Sí |
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.
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)
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.
Los proyectos de CMake para estos tripletos se compilan con CMAKE_SYSTEM_NAME
establecido en "Windows".
- 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.
Comentarios de vcpkg
vcpkg es un proyecto de código abierto. Seleccione un vínculo para proporcionar comentarios: