使用 MSVC 的 Windows
vcpkg 包含 三重組件 ,可用於使用 MSVC cl.exe
編譯程式建置 Windows 傳統型應用程式。
架構 | vcpkg triplets | 社群 |
---|---|---|
x64 | x64-windows | |
x64-windows-release | Yes | |
x64-windows-static | ||
x64-windows-static-md | Yes | |
x64-windows-static-release | Yes | |
x86 | x86-windows | |
x86-windows-static | Yes | |
x86-windows-static-md | Yes | |
arm | arm-windows | Yes |
arm-windows-static | Yes | |
arm64 | arm64-windows | |
arm64-windows-static | Yes | |
arm64-windows-static-md | Yes | |
arm64-windows-static-release | Yes | |
arm64ec | arm64ec-windows | Yes |
static
連結三胞胎會設定為使用 MSVC 運行時間做為靜態庫(亦即 VCPKG_CRT_LINKAGE static
)。
連結 static-md
三胞胎會設定為使用 MSVC 運行時間作為 DLL (亦即 VCPKG_CRT_LINKAGE dynamic
)。 這是建議的解決方案,可針對每個 Microsoft Learn 重新發佈 MSVC 運行時間。
根據預設,vcpkg 會使用安裝在系統上的最新版本Visual Studio來建置程序代碼。 若要選取特定版本,請建立自訂三重疊或三重疊來設定 VCPKG_PLATFORM_TOOLSET
。
例如,這會強制使用Visual Studio 2017 工具組。
set(VCPKG_PLATFORM_TOOLSET v141)
Microsoft Visual C/C++ Runtime 是「正向二進制相容」。 這表示您可以使用 Visual Studio 2015 Update 3、Visual Studio 2017、Visual Studio 2019 和/或 Visual Studio 2022 建置程式代碼,並將其全部連結在一起。 關鍵需求是必須針對 混合中最新的 工具組執行LINK。 請參閱 Microsoft Learn。
這些三胞胎的 CMake 專案是使用 CMAKE_SYSTEM_NAME
設定為 「Windows」 所建置。
- 「Just My Code」偵錯通常可在連結庫中停用,以節省程式代碼空間。
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。