2009-10-26 2 views
3

우리는 VC6 컴파일러로 제작 된 내부 라이브러리 (다른 팀에서 개발 한 라이브러리)를 사용합니다. 이 라이브러리는 주로 C 스타일 API를 포함합니다. Visual Studio 9 컴파일러로 마이그레이션 할 계획입니다. VC9 컴파일러로 라이브러리를 빌드해야합니까?VC9 프로젝트에서 직접 VC6으로 빌드 된 C 스타일 라이브러리를 사용할 수 있습니까?

두 가지 다른 버전의 Visual Studio 컴파일러로 빌드 된 DLL이 다른 점은 무엇입니까 (이름 변경, 최적화 등일 수 있음)?

답변

4

충돌은 일반적으로 C 런타임 라이브러리에서 발생합니다. 주요 아이디어는 할당 된 모듈에서 메모리를 할당 해제해야한다는 것입니다. 그러면 다른 버전의 컴파일러로 빌드 된 라이브러리를 사용하는 것이 안전합니다. 또 다른 문제는 구조체의 패킹이지만 Visual C++ 컴파일러 만 사용하면 아무런 차이가 없습니다.

Name mangling은 Visual C++에서 버전에 따라 다르지만 C++ 라이브러리에만 적용됩니다. C 스타일 내보내기 (예 : DEF 파일이있는 경우)를 사용하면 걱정할 것이 없습니다.

This 질문은 귀하의 전체 사본이 아니지만 도움이 될 수 있습니다.

2

AFAIK, Visual C++ 이름 맹 글링은 릴리스마다 안정적이었습니다.

주된 문제점은 한 버전으로 컴파일 된 코드가 해당 버전의 CRTL과 연결되어 있어야하며 여러 버전의 코드를 동일한 DLL 또는 EXE로 혼합해야한다는 것입니다. 그 이유는 두 개체 코드가 서로 다른 RTL 루틴을 기대하기 때문입니다 .

다른 라이브러리를 포함하는 별도의 DLL을 링크하면 작동합니다. 결국 그것은 DLL의 핵심입니다. (이것은 32 비트 코드 인 경우) 그 시나리오에서

, 나는

또한, 미묘한 잡았다있다 (... __stdcall__ 또는 WINAPI 또는 _cdecl) 명시 적으로 호출 규칙을 지정하는 경우에만 extern "C" API를 사용하는 것이 좋습니다 및 것 응용 프로그램에 CRTL 사본이 여러 개있는 경우 : 여러 개의 힙이 있습니다! 한 힙에 객체를 할당하고 다른 힙으로 해제하면 힙이 즉시 손상되어 충돌이 발생합니다.

모두 컴파일러로 다시 컴파일 할 수 있다면 가장 간단한 방법입니다.