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.
По умолчанию vcpkg будет использовать последнюю версию Visual Studio, установленную в системе для создания кода. Чтобы выбрать определенную версию, создайте настраиваемую тройную или тройную наложение, чтобы задать VCPKG_PLATFORM_TOOLSET
.
Например, это приведет к принудительному использованию набора инструментов Visual Studio 2017.
set(VCPKG_PLATFORM_TOOLSET v141)
Среда выполнения 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.
Отзыв о vcpkg
vcpkg — это проект с открытым исходным кодом. Выберите ссылку, чтобы оставить отзыв: