Auf Englisch lesen

Freigeben über


Windows mit MSVC

Drillinge

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.

Auswählen eines MSVC-Toolsets

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

Dies würde beispielsweise die Verwendung des Visual Studio 2017-Toolsets erzwingen.

set(VCPKG_PLATFORM_TOOLSET v141)

C/C++-Laufzeitkompatibilität

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.

Betreuernotizen

CMake-Projekte für diese Triplets werden mithilfe CMAKE_SYSTEM_NAME von "Windows" erstellt.

Notizen zum Autor der Bibliothek

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