MSVC ile Windows
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 static
olarak kullanacak şekilde ayarlanır.
static-md
Bağlama üçlüleri, MSVC Çalışma Zamanı'nı DLL olarak (örneğin) VCPKG_CRT_LINKAGE dynamic
kullanacak şekilde ayarlanır. Bu, MSVC Çalışma Zamanı'nı Microsoft Learn'e göre yeniden dağıtmak için önerilen çözümdür.
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)
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.
Bu üçüzler için CMake projeleri "Windows" olarak ayarlanmış şekilde CMAKE_SYSTEM_NAME
oluşturulur.
- 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.
vcpkg geri bildirimi
vcpkg, açık kaynak bir projedir. Geri bildirim sağlamak için bir bağlantı seçin: