다른 버전의 C 런타임 라이브러리로 구축 된 라이브러리와 정적으로 연결되어 있습니까?

StackOverflow https://stackoverflow.com/questions/1872759

문제

이 시나리오를 고려하십시오 : 응용 프로그램은 제 3 자 라이브러리 A로 연결됩니다.

A는 MSVC 2008을 사용하여 구축되었으며 정적으로 연결되어 (예 : /MT와 함께 제작) C 런타임 라이브러리 v9.0에 구축됩니다.

응용 프로그램은 MSVC 2005를 사용하여 구축되며 A 및 ( /MT 사용) C 런타임 라이브러리 v8.0에 정적으로 연결됩니다.

런타임 라이브러리 버전 사이의 헤더에서 유형이 변경된 경우에 문제가 있습니다.

런타임 라이브러리 헤더를 버전간에 호환성을 유지하기 위해 간호가 취해 졌습니까, 아니면 항상 정적으로 연결된 모든 라이브러리가 동일한 버전의 런타임 라이브러리에 연결되어 있는지 확인해야합니까?

도움이 되었습니까?

해결책

그것 ~해야 한다 문제가되지 않습니다. 각 라이브러리는 자체 런타임에 연결되며 대부분 프로세스의 다른 라이브러리와 독립적으로 기능합니다. 도서관 ABI가 잘못 정의 된 경우 문제가 발생합니다. 하나의 라이브러리에 할당 된 힙으로 할당 된 힙으로 할당 된 경우, 라이브러리 경계를 가로 질러 전달되고 다른 라이브러리에서 '해제'가있는 경우 다른 힙 관리자가 할당하는 데 사용되는 힙 관리자로부터 블록을 해제하는 데 다른 힙 관리자가 사용되므로 문제가있을 것입니다. 그것.

다른 런타임 버전이 사용될 수있는 모든 종류의 c-runtime 정의 구조, 개체 또는 엔티티가 전달되지 않아야합니다.- 한 라이브러리에서 얻은 파일*'s는 다른 런타임.

라이브러리 API가 원시 유형 만 사용하고 무료 ()을 무료로 전달하려고 시도하지 않는 한, 포인터를 내부 Malloc () 'D 메모리로 전달하여 응용 프로그램 (또는 다른 라이브러리)이 무료 ()를 기대할 수있는 메모리를 전달합니다. 괜찮을거야.

c-runtimes가 혼합 된 경우 "무엇이든 잘못 될 수있다"는 FUD에 대한 쉬운 일이지만, libs와 동적 라이브러리 (.so / .dll / .dylib)가 전통적으로 다양한 종류로 개발되었다는 것을 기억해야합니다. 언어 : ASM, C, C ++, Fortran, Pascal 등으로 작성된 코드가 효과적인 CPU 효율적인 이진 인터페이스를 통해 커뮤니케이션하도록 허용합니다.

C가 C에 연결될 때 왜 갑자기 당황합니까?

다른 팁

이것은 매우 나쁜 계획입니다. 피하다. 2005 년에 라이브러리를 다시 컴파일하거나 2008 년에 응용 프로그램을 컴파일하십시오.

전혀 좋은 생각이 아닙니다. 런타임 라이브러리의 가정과 특정 유형을 구현하는 방법을 제어 할 수 없습니다. 이것은 그렇지 않은 것보다 거룩하지 않은 혼란을 일으킬 가능성이 높습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top