閱讀英文

共用方式為


使用 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 運行時間。

選取 MSVC 工具組

根據預設,vcpkg 會使用安裝在系統上的最新版本Visual Studio來建置程序代碼。 若要選取特定版本,請建立自訂三重疊或三重疊來設定 VCPKG_PLATFORM_TOOLSET

例如,這會強制使用Visual Studio 2017 工具組。

set(VCPKG_PLATFORM_TOOLSET v141)

C/C++ 執行時間相容性

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