Visual Studio 버전 간의 C++ 이진 호환성

Visual Studio 2013 및 이전 버전의 MSVC(Microsoft C++) 컴파일러 도구 집합은 주 버전 간에 이진 호환성을 보장하지 않습니다. 이러한 도구 세트의 다른 버전에서 빌드한 개체 파일, 정적 라이브러리, 동적 라이브러리 및 실행 파일을 연결할 수 없습니다. API, 개체 형식 및 런타임 라이브러리는 호환되지 않습니다.

Visual Studio 2015 이상 버전에서 이 동작을 변경했습니다. 이러한 버전의 컴파일러에서 컴파일한 런타임 라이브러리 및 앱은 이진 호환됩니다. Visual Studio 2015 이후 모든 버전에 대해 14로 시작하는 C++ 도구 집합 주 번호에 반영됩니다. 도구 집합 버전은 Visual Studio 2015용 v140, 2017용 v141, 2019의 경우 v142, 2022의 경우 v143입니다. Visual Studio 2015에서 빌드한 타사 라이브러리가 있다고 가정해 보겠습니다. Visual Studio 2017, 2019 또는 2022에서 빌드한 애플리케이션에서 계속 사용할 수 있습니다. 일치하는 도구 집합으로 다시 컴파일할 필요가 없습니다. 최신 버전의 Microsoft Visual C++ 재배포 가능 패키지 패키지(재배포 가능 패키지)는 모두 작동합니다.

이진 호환성에 대한 제한 사항

v140, v141, v142 및 v143 도구 집합과 부 번호가 매겨진 버전 업데이트 간의 이진 호환성에 대한 세 가지 중요한 제한 사항이 있습니다.

  • v140, v141, v142 및 v143 도구 집합의 다른 버전으로 만든 이진 파일을 결합할 수 있습니다. 키 규칙은 링커가 자체와 동일한 버전(또는 이전 버전)인 도구 집합에서 빌드한 입력만 사용해야 한다는 것입니다. 이는 LINK 입력 파일에 설명된 대로 앱, 가져오기 라이브러리, 정적 라이브러리 및 기타 파일에 적용됩니다. 경우에 따라 도구 집합의 이후 버전에서 빌드된 암시적으로 연결된 DLL에 대한 가져오기 라이브러리는 이전 버전의 도구 집합을 사용하여 연결할 수 있습니다. 특히 가져오기 라이브러리가 가져오기/내보내기에서 엄격하게 사용하는 extern "C" 경우에 특히 그렇습니다. 다음은 이 모든 것의 의미에 대한 몇 가지 예입니다.
    • 2017 도구 집합(v141, 버전 15.0 ~ 15.9)으로 컴파일된 앱은 Visual Studio 2022 버전 17.8(v143)으로 컴파일된 정적 라이브러리에 연결할 수 있지만 버전 17.8 이상 도구 집합을 사용하여 연결을 수행해야 합니다.
    • VS 2015, 2017, 2019 또는 2022를 사용하여 빌드된 앱 및 라이브러리는 함께 연결할 수 있지만 링커에 전달하는 이진 파일을 빌드하는 데 사용되는 최신 도구 집합 또는 최신 도구 집합 버전을 사용하여 연결을 수행해야 합니다. 예를 들어 VS 2015 버전 14.3, VS 2017 버전 15.9 및 VS 2019 버전 16.11의 도구 집합으로 빌드된 세 개의 이진 파일을 지정하면 16.11 이상의 도구 집합 버전을 사용하여 연결할 수 있습니다.
    • 최신 도구 집합을 사용하여 DLL을 빌드한 경우 모든 내보내기가 C 언어 호출 규칙(extern "C")을 따르는 경우 가져오기 라이브러리를 이전 도구 집합과 함께 사용할 수 있습니다. 그러나 공식적으로 지원되는 유일한 사례는 이전 도구 집합과 함께 최신 Windows SDK를 사용하는 것입니다.
  • 앱에서 사용하는 재배포 가능 패키지에는 유사한 이진 호환성 제한이 있습니다. 지원되는 다른 버전의 도구 집합에서 빌드한 이진 파일을 혼합하는 경우 재배포 가능 버전은 적어도 모든 앱 구성 요소에서 사용하는 최신 도구 집합만큼 새 버전이어야 합니다.
  • (전체 프로그램 최적화) 컴파일러 스위치를 사용하여 /GL 컴파일되거나 링크 시간 코드 생성을 사용하여/LTCG연결된 정적 라이브러리 또는 개체 파일은 부 버전 업데이트를 포함하여 버전 간에 이진 호환되지 않습니다. 모든 개체 파일 및 라이브러리는 컴파일을 사용하여 /GL 컴파일되며 컴파일 및 /LTCG 최종 링크에 정확히 동일한 도구 집합을 사용해야 합니다. 예를 들어 Visual Studio 2019 버전 16.7 도구 집합에서 사용하여 /GL 빌드된 코드는 Visual Studio 2019 버전 16.8 도구 집합에서 사용하여 /GL 빌드된 코드에 연결할 수 없습니다. 컴파일러는 심각한 오류 C1047내보낸다.

Visual Studio 2015 이상에서 Microsoft Visual C++ 재배포 가능 패키지 업그레이드

Microsoft Visual C++ 재배포 가능 패키지 주 버전 번호는 Visual Studio 2015, 2017, 2019 및 2022와 동일하게 유지했습니다. 즉, 한 번에 하나의 재배포 가능 패키지 인스턴스만 설치할 수 있습니다. 최신 버전은 이미 설치된 이전 버전을 덮어씁니다. 예를 들어 하나의 앱이 Visual Studio 2015에서 재배포 가능 패키지 설치할 수 있습니다. 그런 다음, 다른 앱이 Visual Studio 2022에서 재배포 가능 패키지 설치 2022 버전은 이전 버전을 덮어쓰지만 이진 호환이 가능하기 때문에 이전 앱은 여전히 정상적으로 작동합니다. 재배포 가능 패키지의 최신 버전에는 최신 기능, 보안 업데이트 및 버그 수정이 모두 포함되어 있는지 확인합니다. 따라서 항상 사용 가능한 최신 버전으로 업그레이드하는 것이 좋습니다.

마찬가지로 최신 버전이 이미 설치된 경우 이전 재배포 가능 패키지는 설치할 수 없습니다. 시도하면 설치 관리자가 오류를 보고합니다. 2022 버전이 이미 있는 컴퓨터에 2017 또는 2019 재배포 가능 파일을 설치하면 다음과 같은 오류가 표시됩니다.

0x80070666 - Another version of this product is already installed. Installation of this version cannot continue. To configure or remove the existing version of this product, use Add/Remove Programs on the Control Panel.

이 오류는 의도적으로 수행됩니다. 최신 버전을 설치하는 것이 좋습니다. 설치 관리자가 이 오류에서 자동으로 복구할 수 있는지 확인합니다.

Important

Windows XP에 대한 런타임 라이브러리 지원은 Visual Studio용 최신 Visual C++ 재배포 가능 패키지 더 이상 사용할 수 없습니다. Windows XP를 지원하는 마지막 재배포 가능 패키지는 버전 16.7(파일 버전 14.27.29114.0)입니다. Windows XP 앱이 이후 버전의 재배포 가능 패키지로 배포되거나 업데이트되는 경우 앱이 실행되지 않습니다. 자세한 내용 및 Windows XP를 지원하는 재배포 가능 패키지 버전을 가져오는 방법은 Windows XP에 대한 프로그램 구성을 참조하세요.

참고 항목

Visual C++ 변경 기록
지원되는 최신 Visual C++ 재배포 가능 패키지 다운로드