Windows con MSVC
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 | 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ì |
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.
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)
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.
I progetti CMake per questi tripletti vengono compilati usando CMAKE_SYSTEM_NAME
impostato su "Windows".
- 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.
Feedback su vcpkg
vcpkg è un progetto di open source. Selezionare un collegamento per fornire feedback: