2017-12-17 6 views
1

Visual Studio 2015 및 2012에는 호환되지 않는 C 런타임 라이브러리가 있습니다. 2012를 사용하여 구축 한 링크 라이브러리에 2015 빌드 응용 프로그램을 연결하려고하면 링커 오류가 발생합니다.호환되지 않는 버전의 Visual Studio에서 시스템 DLL이 어떻게 작동합니까?

그러나 OpenGL32.dll과 같은 시스템 라이브러리에 2015 년과 2012 년 앱을 모두 연결할 수 있습니다. 그들은 어떻게 그것을 성취합니까?

CRT (예 :/MD 대신/CRT)에 정적으로 연결하기 만하면됩니까? 그것을 시도 할 때 나는 여전히 링크 오류가 발생합니다.

+1

스레딩 모델보다 걱정할 사항이 있습니다. 예를 들어'std :: string &'이 라이브러리 함수의 매개 변수로 사용된다고 가정하십시오. 또한'std :: string'의 구현이 2012 년과 2015 년 사이에 바뀌었을 가능성이 매우 높습니다.이 다른 문자열로 라이브러리 함수를 호출하는 것이 모험이 될 수 있습니다. 그러나 dll 인터페이스가 Plain Old Data (POD) 데이터 유형을 사용하는 C 스타일의 함수 일 뿐이라면 다른 언어를 포함하여 거의 모든 것으로 호출 할 수 있습니다. – user4581301

+1

기본적으로 다른 라이브러리는 원본 및 바이너리 수준 모두에서 인터페이스를 유지 관리합니다. 또한 Windows에서 동시에로드되는 프로세스에서 여러 개의 C 런타임을 가질 수 있으므로 모든 사람이 원하는 것을 얻을 수 있습니다. 물론 이러한 런타임은 상호 운용 할 수 없습니다. – Ivan

+0

Windows 시스템 DLL은 Visual Studio에 연결되어 있지 않습니다. 어셈블리에서조차도 사용할 수 있습니다. 심지어 더 강해서, DLL이 작성되었을 때조차도 존재하지 않는 언어로 사용될 수 있습니다. 논리적입니다. 애플리케이션은 OS에 적응해야합니다. – MSalters

답변

1

참조하는 오류가 정의되지 않은 경우 C++에서 사용하는 데코 레이팅 된 이름을 참조하면 다른 라이브러리에서 작동하는 이유는 C 인터페이스 만 내보내는 것입니다. 시스템 라이브러리가 다형성 객체를 내보내는 곳 (예 : COM에서와 같이)에서도 C 언어 인터페이스를 통해 그렇게합니다. 그리고 네, 만약 다른 라이브러리가 자신의 정의되지 않은 참조에 대해 불평하지 않는다면 런타임에 정적으로 링크됩니다.

또한 MSVC에는 C++ 런타임에 종속 된 개체 파일을 다른 버전의 라이브러리에서 사용하지 못하도록하는 개체 파일과 링커 확장이 있습니다. 이것은 코드가 소스에서 빌드 된 후 새로운 런타임에 링크 된 경우 잘 작동하더라도 완료됩니다. 코드에서 변경하지 않고 소스에서 다시 빌드하면 오브젝트가 호환되지 않는 방식으로 변경되는 것은 매우 쉽습니다.