2011-06-14 5 views
1

Visual Studio 2003 SP1로 작성된 C++ \ MFC 응용 프로그램을 외부 정적 라이브러리 "SomeExtStaticLib.lib"에 연결합니다. 또한 "SomeExtStaticLib.lib"와 함께 제공된 헤더 파일을 포함하여 응용 프로그램에 개체를 만듭니다.정적 라이브러리가 이름 맹 글링 문제를 방지합니까?

SomeExtStaticLib.lib은 VC6으로 빌드 된 정적 라이브러리입니다.

지금, 나는 비주얼 스튜디오 2008

내 애플리케이션을 마이그레이션하고 난 아주 기본적인 질문이 있습니다.

또한 "SomeExtStaticLib.lib"를 VS2008로 컴파일해야합니까? 이 VC6 컴파일 된 "SomeExtStaticLib.lib"내 VC9 컴파일 된 응용 프로그램에서 사용할 때 모든 링커 오류를 제공하지 않았습니다. 나는 적어도 약간의 유명한 mangling 이슈를 기대하고 있었다.

이름 바꾸기 문제를 제거하는 정적 라이브러리가 있습니까?

답변

1

응용 프로그램이 변경되지 않은 경우 라이브러리의 동일한 심볼 세트가 필요합니다. 따라서 아마도 VC6.0으로 컴파일 된 라이브러리에 링크 할 수 있습니다. 응용 프로그램과 라이브러리가 모두 VC6.0의 호환 가능한 (작동중인) 것과 동일하지 않으면 이름 맹 글링은 전혀 문제가되지 않습니다.

또한 SomeExtStaticLib.lib을 VS2008로 컴파일해야합니까?
당신은 비주얼 2008

와을 yor 라이브러리를 다시 작성해야 VC6.0 시각 2008 그래서 YES 사이에 호환성 문제가 있습니다 라이브러리에 링크 할 수 있기 때문에 그냥 그대로 작동합니다 의미하지 않는다 바르게.

이름 바꾸기 문제를 제거하는 정적 라이브러리가 있습니까?
아니요. 그들은 특별한 일을 전혀하지 않습니다.

0

정적 라이브러리는 이름 변환을하지 않거나하지 않아도됩니다 .... 코드가 C++ 인 경우에는 mangling이 있고 C (또는 C++의 extern "C")가 mangling이없는 경우. 링크 된 라이브러리와 코드가 일치하는 한 라이브러리에 링크 할 때 아무런 문제가 없습니다.

2

문제는 정적 대 동적 연결 중 하나가 아니며 실제로는 맹 글링이라는 문제가 아닙니다. 이 문제는 인터페이스에서 으로 사용되는 모든 것에 대한 이진 호환성 중 하나입니다. 따라서 예를 들어 내가 틀리게 잘못 생각하지 않는 한 의 정의가 std::string 인 경우 VC6과 VC9가 달라지며 레이아웃이 다릅니다. 따라서 코드 중 어느 하나라도 std::string을 사용하면 을 다시 컴파일하거나 런타임에 이상하고 알 수없는 오류가 발생합니다.

일반적으로 다른 버전의 컴파일러 또는 다른 컴파일 옵션이 포함 된 경우에는 공급 업체가 별도로 보증하지 않는 한 이진 호환성을 유지하지 않는 것이 가장 좋습니다. (예 : 몇 가지 상식이 있습니다 : 예를 들어 제어 경고 만 자유롭게 조합 할 수 있습니다. 그러나 디버깅 코드가 생성되도록하려면 /D을주의하십시오.)

+0

인터페이스뿐 아니라 메모리 할당 및 할당 해제가 변경되었을 수도 있습니다. 즉, lib에 할당 된 메모리를 해제하거나 lib가 할당 한 메모리를 해제하면 정의되지 않은 일이 발생합니다. 여기에는 던져지고 잡히는 곳에서 해제되는 예외가 포함됩니다. –

+0

@Tobias Langner 이것은 컴파일하고 링크 한 방법에 달려 있습니다. '/ MD' 또는'/ MDd'를 사용한다면 문제가되지 않습니다. (적어도 나는 그렇게 생각하지 않는다.) –