Ler em inglês

Compartilhar via


Windows com MSVC

Trigêmeos

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.

Selecionando um conjunto de ferramentas MSVC

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)

Compatibilidade de tempo de execução C/C++

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.

Notas do mantenedor

Os projetos do CMake para esses trigêmeos são criados usando CMAKE_SYSTEM_NAME definido como "Windows".

Notas do autor da biblioteca

  • 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.