Leggere in inglese

Condividi tramite


Windows con MSVC

Tripletta

vcpkg include triplette per la compilazione di applicazioni desktop di Windows tramite il compilatore MSVC cl.exe .

Architettura triplet vcpkg Community
x64 Finestre x64
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

I static tripletti di collegamento sono impostati per l'uso del runtime MSVC come libreria statica ( ad esempio VCPKG_CRT_LINKAGE static).

I static-md tripletti di collegamento sono impostati per usare il runtime MSVC come DLL ( ad esempio VCPKG_CRT_LINKAGE dynamic). Questa è la soluzione consigliata per ridistribuire il runtime MSVC per Microsoft Learn.

Selezione di un set di strumenti MSVC

Per impostazione predefinita, vcpkg userà la versione più recente di Visual Studio installata nel sistema per la compilazione del codice. Per selezionare una versione specifica, creare una sovrimpressione tripletta o tripletta personalizzata per impostare VCPKG_PLATFORM_TOOLSET.

Ad esempio, questo forza l'uso del set di strumenti di Visual Studio 2017.

set(VCPKG_PLATFORM_TOOLSET v141)

Compatibilità del runtime C/C++

Il runtime di Microsoft Visual C/C++ è "compatibile con binari in avanti". Ciò significa che è possibile compilare codice con Visual Studio 2015 Update 3, Visual Studio 2017, Visual Studio 2019 e/o Visual Studio 2022 e collegarlo tutti insieme. Il requisito chiave è che il LINK deve essere eseguito rispetto al set di strumenti più recente nella combinazione. Vedere Microsoft Learn.

Note del manutentore

I progetti CMake per questi tripletti vengono compilati usando CMAKE_SYSTEM_NAME impostato su "Windows".

Note sulla creazione di librerie

  • Il debug "Just My Code" può in genere essere disabilitato in una libreria per risparmiare spazio sul codice.
if(MSVC)
    target_compile_options(mytarget PRIVATE /JMC-)
endif()
  • MSBuild aggiunge automaticamente alcuni flag di compilazione che non sono attivati per impostazione predefinita nel compilatore MSVC stesso. Per garantire lo stesso comportamento con Ninja o altri generatori, aggiungere queste impostazioni di compilazione.
if(MSVC)
    target_compile_options(mytarget PRIVATE /Zc:inline)
endif()
  • Le impostazioni di compilazione consigliate per le versioni più recenti di MSVC sono incoraggiate per migliorare la sicurezza del codice.
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()
  • Per migliorare la conformità standard C/C++, usare le impostazioni del commutatore più recenti.
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()
  • Per supportare l'uso dell'intera ottimizzazione programma/generazione di codice in fase di collegamento, le impostazioni di compilazione consigliate sono le seguenti:
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 si abilitano le mitigazioni Spectre, usare le guardie seguenti.
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()

Si noti che è anche possibile fornire un'opzione di compilazione CMake esplicita per controllare anche questo.

Vedere Microsoft Learn.