Прочитать на английском

Поделиться через


Windows с MSVC

Тройня

vcpkg включает в себя триплеты для создания классических приложений Windows с помощью компилятора MSVC cl.exe .

Архитектура vcpkg triplets Сообщество
x64 x64-windows
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 Да

Триплеты static связывания задаются для использования среды выполнения MSVC в качестве статической библиотеки (т. е. VCPKG_CRT_LINKAGE static).

Триплеты static-md связывания задаются для использования среды выполнения MSVC в качестве библиотеки DLL (т. е. VCPKG_CRT_LINKAGE dynamic). Это рекомендуемое решение для распространения среды выполнения MSVC на Microsoft Learn.

Выбор набора инструментов MSVC

По умолчанию vcpkg будет использовать последнюю версию Visual Studio, установленную в системе для создания кода. Чтобы выбрать определенную версию, создайте настраиваемую тройную или тройную наложение, чтобы задать VCPKG_PLATFORM_TOOLSET.

Например, это приведет к принудительному использованию набора инструментов Visual Studio 2017.

set(VCPKG_PLATFORM_TOOLSET v141)

Совместимость среды выполнения C/C++

Среда выполнения Microsoft Visual C/C++ является "совместимой с двоичным файлом пересылки". Это означает, что вы можете создать код с помощью Visual Studio 2015 с обновлением 3, Visual Studio 2017, Visual Studio 2019 и (или) Visual Studio 2022 и связать все это вместе. Ключевое требование заключается в том, что LINK необходимо выполнить в отношении новейших наборов инструментов в смеси. См. статью Microsoft Learn.

Заметки о поддержке

Проекты CMake для этих тройных наборов создаются с помощью CMAKE_SYSTEM_NAME параметра "Windows".

Заметки автора библиотеки

  • Отладка "Просто мой код" обычно может быть отключена в библиотеке для экономии пространства кода.
if(MSVC)
    target_compile_options(mytarget PRIVATE /JMC-)
endif()
  • MSBuild автоматически добавит некоторые флаги сборки, которые не включены по умолчанию в самом компиляторе MSVC. Чтобы обеспечить такое же поведение с Ninja или другими генераторами, добавьте эти параметры сборки.
if(MSVC)
    target_compile_options(mytarget PRIVATE /Zc:inline)
endif()
  • Рекомендуемые параметры сборки для более новых версий 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()
  • Для улучшения соответствия C/C++ используйте последние параметры коммутатора.
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()
  • Чтобы обеспечить поддержку использования полной оптимизации программы и создания кода со связью, рекомендуемые параметры сборки приведены следующим образом:
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()
  • Если включить устранение рисков Spectre, используйте следующие охранники.
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()

Обратите внимание, что вы также можете предоставить явный параметр сборки CMake для управления этим.

См. статью Microsoft Learn.