Číst v angličtině

Sdílet prostřednictvím


Windows s MSVC

Trojčata

Vcpkg obsahuje trojité tečky pro vytváření desktopových aplikací windows pomocí kompilátoru MSVC cl.exe .

Architektura vcpkg triplets Komunita
x64 x64-windows
x64-windows-release Ano
x64-windows-static
x64-windows-static-md Ano
x64-windows-static-release Ano
x86 x86-windows
x86-windows-static Ano
x86-windows-static-md Ano
paže arm-windows Ano
arm-windows-static Ano
arm64 arm64-windows
arm64-windows-static Ano
arm64-windows-static-md Ano
arm64-windows-static-release Ano
arm64ec arm64ec-windows Ano

Propojování static tripletů je nastavené tak, aby používalo modul runtime MSVC jako statickou knihovnu (tj. VCPKG_CRT_LINKAGE static).

Propojování static-md tripletů je nastaveno tak, aby používalo modul runtime MSVC jako knihovnu DLL (tj. VCPKG_CRT_LINKAGE dynamic). Toto je doporučené řešení pro redistribuci modulu RUNTIME MSVC na Microsoft Learn.

Výběr sady nástrojů MSVC

Ve výchozím nastavení bude vcpkg používat nejnovější verzi sady Visual Studio nainstalovanou v systému pro sestavování kódu. Pokud chcete vybrat konkrétní verzi, vytvořte vlastní trojité nebo trojité překrytí, které chcete nastavit VCPKG_PLATFORM_TOOLSET.

To by například vynutilo použití sady nástrojů sady Visual Studio 2017.

set(VCPKG_PLATFORM_TOOLSET v141)

Kompatibilita modulu runtime C/C++

Modul runtime Microsoft Visual C/C++ je "dopředný binární kompatibilní". To znamená, že můžete sestavit kód pomocí sady Visual Studio 2015 Update 3, Visual Studio 2017, Visual Studio 2019 a/nebo sady Visual Studio 2022 a propojit ho dohromady. Klíčovým požadavkem je, aby se odkaz provedl s nejnovější sadou nástrojů ve mixu. Viz Microsoft Learn.

Poznámky k údržbě

Projekty CMake pro tyto triplety se sestavují pomocí CMAKE_SYSTEM_NAME nastavení na "Windows".

Poznámky autora knihovny

  • Ladění "Jen můj kód" je obvykle možné zakázat v knihovně, aby se ušetřilo místo na kódu.
if(MSVC)
    target_compile_options(mytarget PRIVATE /JMC-)
endif()
  • Nástroj MSBuild automaticky přidá některé příznaky sestavení, které nejsou ve výchozím nastavení v samotném kompilátoru MSVC. Pokud chcete zajistit stejné chování s Ninja nebo jinými generátory, přidejte tato nastavení sestavení.
if(MSVC)
    target_compile_options(mytarget PRIVATE /Zc:inline)
endif()
  • Pro lepší zabezpečení kódu se doporučuje doporučené nastavení sestavení pro novější verze MSVC.
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()
  • Pro lepší shodu standardu C/C++ použijte nejnovější nastavení přepínače.
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()
  • Pro podporu použití optimalizace celého programu / generování kódu v čase link-time jsou doporučená nastavení sestavení následující:
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()
  • Pokud povolíte zmírnění rizik spectre, použijte následující stráže.
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()

Všimněte si, že můžete také poskytnout explicitní možnost sestavení CMake, která tuto možnost řídí.

Viz Microsoft Learn.