영어로 읽기

다음을 통해 공유


MSVC를 사용하는 Windows

쌍둥이

vcpkg에는 MSVC cl.exe 컴파일러를 사용하여 Windows 데스크톱 애플리케이션을 빌드하기 위한 트리플렛이 포함되어 있습니다.

아키텍처 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: )로 사용하도록 설정됩니다. Microsoft LearnMSVC 런타임을 재배포하는 데 권장되는 솔루션입니다.

MSVC 도구 집합 선택

기본적으로 vcpkg는 코드를 빌드하기 위해 시스템에 설치된 최신 버전의 Visual Studio를 사용합니다. 특정 버전을 선택하려면 설정할 VCPKG_PLATFORM_TOOLSET사용자 지정 트리플렛 또는 트리플렛 오버레이를 만듭니다.

예를 들어 Visual Studio 2017 도구 집합을 강제로 사용해야 합니다.

set(VCPKG_PLATFORM_TOOLSET v141)

C/C++ 런타임 호환성

Microsoft Visual C/C++ 런타임은 '전달 이진 호환'입니다. 즉, Visual Studio 2015 업데이트 3, Visual Studio 2017, Visual Studio 2019 및/또는 Visual Studio 2022를 사용하여 코드를 빌드하고 모두 연결할 수 있습니다. 주요 요구 사항은 조합의 최신 도구 집합에 대해 LINK를 수행해야 한다는 것입니다. Microsoft Learn을 참조하세요.

유지 관리자 노트

이러한 세 쌍둥이에 대한 CMake 프로젝트는 "Windows" 집합을 사용하여 CMAKE_SYSTEM_NAME 빌드됩니다.

라이브러리 작성자 노트

  • 일반적으로 라이브러리에서 "내 코드만" 디버깅을 사용하지 않도록 설정하여 코드 공간을 절약할 수 있습니다.
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을 참조하세요.