İngilizce dilinde oku

Aracılığıyla paylaş


MSVC ile Windows

Üçüz

vcpkg, MSVC cl.exe derleyicisini kullanarak Windows masaüstü uygulamaları oluşturmak için üçlüler içerir.

Mimari vcpkg üçlüleri Topluluk
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
kol 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 Bağlama üçlüleri, MSVC Çalışma Zamanı'nı statik kitaplık (örneğin) VCPKG_CRT_LINKAGE staticolarak kullanacak şekilde ayarlanır.

static-md Bağlama üçlüleri, MSVC Çalışma Zamanı'nı DLL olarak (örneğin) VCPKG_CRT_LINKAGE dynamickullanacak şekilde ayarlanır. Bu, MSVC Çalışma Zamanı'nı Microsoft Learn'e göre yeniden dağıtmak için önerilen çözümdür.

MSVC araç takımı seçme

Varsayılan olarak, vcpkg kod oluşturmak için sistemde yüklü olan en son Visual Studio sürümünü kullanır. Belirli bir sürümü seçmek için ayarlamak VCPKG_PLATFORM_TOOLSETüzere özel bir üçlü veya üçlü katman oluşturun.

Örnekler için bu, Visual Studio 2017 araç takımının kullanılmasını zorlar.

set(VCPKG_PLATFORM_TOOLSET v141)

C/C++ Çalışma Zamanı uyumluluğu

Microsoft Visual C/C++ Çalışma Zamanı 'forward binary compatible'dir. Bu, Visual Studio 2015 Güncelleştirme 3, Visual Studio 2017, Visual Studio 2019 ve/veya Visual Studio 2022 ile kod derleyebileceğiniz ve hepsini birbirine bağlayabileceğiniz anlamına gelir. Önemli gereksinim, LINK'in karışımdaki en yeni araç takımına karşı yapılması gerektiğidir. Bkz. Microsoft Learn.

Bakımcı notları

Bu üçüzler için CMake projeleri "Windows" olarak ayarlanmış şekilde CMAKE_SYSTEM_NAME oluşturulur.

Kitaplık yazarı notları

  • Kod alanından tasarruf etmek için genellikle kitaplıkta "Yalnızca Kodum" hata ayıklaması devre dışı bırakılabilir.
if(MSVC)
    target_compile_options(mytarget PRIVATE /JMC-)
endif()
  • MSBuild, MSVC derleyicisinde varsayılan olarak açık olmayan bazı derleme bayraklarını otomatik olarak ekler. Ninja veya diğer oluşturucularla aynı davranışı sağlamak için bu derleme ayarlarını ekleyin.
if(MSVC)
    target_compile_options(mytarget PRIVATE /Zc:inline)
endif()
  • Geliştirilmiş kod güvenliği için MSVC'nin daha yeni sürümleri için önerilen derleme ayarları önerilir.
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()
  • Geliştirilmiş Standart C/C++ Uyumluluğu için en son anahtar ayarlarını kullanın.
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()
  • Tüm Program İyileştirme / Bağlantı Zamanı Kodu Oluşturma'nın kullanımını desteklemek için önerilen derleme ayarları aşağıdaki gibidir:
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 azaltmalarını etkinleştiriyorsanız aşağıdaki korumaları kullanın.
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()

Bunu denetlemek için açık bir CMake derleme seçeneği de sağlamak isteyebileceğinizi unutmayın.

Bkz. Microsoft Learn.