Windows mit MSVC
vcpkg enthält Dreifache zum Erstellen von Windows-Desktopanwendungen mithilfe des MSVC-Compilers cl.exe
.
Aufbau | vcpkg-Dreifache | Community |
---|---|---|
x64 | x64-Fenster | |
x64-windows-release | Ja | |
x64-windows-static | ||
x64-windows-static-md | Ja | |
x64-windows-static-release | Ja | |
x86 | x86-Fenster | |
x86-windows-static | Ja | |
x86-windows-static-md | Ja | |
arm | Armfenster | Ja |
arm-windows-static | Ja | |
arm64 | arm64-windows | |
arm64-windows-static | Ja | |
arm64-windows-static-md | Ja | |
arm64-windows-static-release | Ja | |
arm64ec | arm64ec-windows | Ja |
Die static
Verlinkungs-Triplets werden so festgelegt, dass die MSVC-Runtime als statische Bibliothek verwendet wird (d. h. VCPKG_CRT_LINKAGE static
).
Die static-md
Verlinkungs-Triplets werden so festgelegt, dass die MSVC-Runtime als DLL verwendet wird (d. h. VCPKG_CRT_LINKAGE dynamic
). Dies ist die empfohlene Lösung für die Umverteilung der MSVC-Runtime pro Microsoft Learn.
Standardmäßig verwendet vcpkg die neueste Version von Visual Studio, die auf dem System zum Erstellen von Code installiert ist. Um eine bestimmte Version auszuwählen, erstellen Sie ein benutzerdefiniertes Triplet- oder Triplet-Overlay, das festgelegt werden VCPKG_PLATFORM_TOOLSET
soll.
Dies würde beispielsweise die Verwendung des Visual Studio 2017-Toolsets erzwingen.
set(VCPKG_PLATFORM_TOOLSET v141)
Die Microsoft Visual C/C++-Runtime ist "forward binary compatible". Dies bedeutet, dass Sie Code mit Visual Studio 2015 Update 3, Visual Studio 2017, Visual Studio 2019 und/oder Visual Studio 2022 erstellen und alles miteinander verknüpfen können. Die wichtigste Voraussetzung ist, dass der LINK mit dem neuesten Toolset in der Mischung durchgeführt werden muss. Siehe Microsoft Learn.
CMake-Projekte für diese Triplets werden mithilfe CMAKE_SYSTEM_NAME
von "Windows" erstellt.
- Das Debuggen von "Just My Code" kann in der Regel in einer Bibliothek deaktiviert werden, um Codeplatz zu sparen.
if(MSVC)
target_compile_options(mytarget PRIVATE /JMC-)
endif()
- MSBuild fügt automatisch einige Build-Flags hinzu, die nicht standardmäßig im MSVC-Compiler selbst vorhanden sind. Um das gleiche Verhalten mit Ninja oder anderen Generatoren sicherzustellen, fügen Sie diese Buildeinstellungen hinzu.
if(MSVC)
target_compile_options(mytarget PRIVATE /Zc:inline)
endif()
- Empfohlene Buildeinstellungen für neuere Versionen von MSVC werden zur Verbesserung der Codesicherheit empfohlen.
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()
- Verwenden Sie für verbesserte C/C++-Konformität die neuesten Switcheinstellungen.
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()
- Um die Verwendung der Gesamten Programmoptimierung / Link-Time Code-Generierung zu unterstützen, sind die empfohlenen Buildeinstellungen wie folgt:
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()
- Wenn Sie Spectre-Gegenmaßnahmen aktivieren, verwenden Sie die folgenden Schutzvorrichtungen.
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()
Beachten Sie, dass Sie auch eine explizite CMake-Buildoption bereitstellen möchten, um dies ebenfalls zu steuern.
Siehe Microsoft Learn.
Feedback zu vcpkg
vcpkg ist ein Open Source-Projekt. Wählen Sie einen Link aus, um Feedback zu geben: