Visual Studio 버전 간의 C++ 이진 호환성
Visual Studio 2013 및 이전 버전의 MSVC(Microsoft C++) 컴파일러 도구 집합은 주 버전 간에 이진 호환성을 보장하지 않습니다. 이러한 도구 세트의 다른 버전에서 빌드한 개체 파일, 정적 라이브러리, 동적 라이브러리 및 실행 파일은 연결할 수 없습니다. ABI, 개체 형식 및 런타임 라이브러리는 호환되지 않습니다.
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용 프로그램 구성을 참조하세요.