Windows com MSVC
vcpkg inclui trigêmeos para criar aplicativos da área de trabalho do Windows usando o compilador MSVC cl.exe
.
Arquitetura | trigêmeos vcpkg | Comunidade |
---|---|---|
x64 | x64-janelas | |
versão x64-windows | Sim | |
x64-windows-estático | ||
x64-janelas-estática-md | Sim | |
x64-windows-static-release | Sim | |
x86 | x86-janelas | |
x86-windows-estático | Sim | |
x86-janelas-estática-md | Sim | |
arm | janelas de braço | Sim |
braço-janelas-estático | Sim | |
arm64 | em braço64-janelas | |
arm64-windows-estático | Sim | |
arm64-janelas-estática-md | Sim | |
arm64-windows-static-release | Sim | |
arm64ec | arm64ec-windows | Sim |
Os static
trigêmeos de vinculação são definidos para usar o MSVC Runtime como uma biblioteca estática (ou seja, VCPKG_CRT_LINKAGE static
).
Os static-md
trigêmeos de vinculação são definidos para usar o MSVC Runtime como uma DLL (ou seja, VCPKG_CRT_LINKAGE dynamic
). Essa é a solução recomendada para redistribuir o MSVC Runtime por Microsoft Learn.
Por padrão, o vcpkg usará a versão mais recente do Visual Studio instalada no sistema para criar código. Para selecionar uma versão específica, crie um trigêmeo personalizado ou uma sobreposição de trigêmeos para definir VCPKG_PLATFORM_TOOLSET
.
Por exemplo, isso forçaria o uso do conjunto de ferramentas do Visual Studio 2017.
set(VCPKG_PLATFORM_TOOLSET v141)
O Microsoft Visual C/C++ Runtime é 'compatível com binário de encaminhamento'. Isso significa que você pode criar código com o Visual Studio 2015 Atualização 3, Visual Studio 2017, Visual Studio 2019 e/ou Visual Studio 2022 e vincular tudo junto. O principal requisito é que o LINK deve ser feito em relação ao conjunto de ferramentas mais recente da mistura. Consulte Microsoft Learn.
Os projetos do CMake para esses trigêmeos são criados usando CMAKE_SYSTEM_NAME
definido como "Windows".
- A depuração "Just My Code" geralmente pode ser desabilitada em uma biblioteca para economizar espaço no código.
if(MSVC)
target_compile_options(mytarget PRIVATE /JMC-)
endif()
- O MSBuild adicionará automaticamente alguns sinalizadores de build que não estão ativados por padrão no próprio compilador MSVC. Para garantir o mesmo comportamento com o Ninja ou outros geradores, adicione estas configurações de compilação.
if(MSVC)
target_compile_options(mytarget PRIVATE /Zc:inline)
endif()
- As configurações de build recomendadas para versões mais recentes do MSVC são incentivadas para melhorar a segurança do 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 melhorar a conformidade padrão C/C++, use as configurações mais recentes do switch.
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 dar suporte ao uso de Otimização de Programa Inteiro/Geração de Código de Tempo de Vinculação, as configurações de build recomendadas são as seguintes:
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()
- Se estiver habilitando mitigações do Spectre, use as seguintes proteções.
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()
Observe que talvez você também queira fornecer uma opção de build explícita do CMake para controlar isso também.
Consulte Microsoft Learn.
Comentários do vcpkg
O vcpkg é um projeto código aberto. Selecione um link para fornecer comentários: