2012-07-25 2 views
15

디버그 바이너리에서 타사 라이브러리의 릴리스 버전을 사용하는 것은 나쁜 습관입니까?디버깅과 릴리스 라이브러리/바이너리 혼합 - 나쁜 습관?

타사 라이브러리를 사용하고 릴리스 .lib 라이브러리를 컴파일했습니다. 내 exe는 디버그 모드 개발 중입니다. 내가 디버그와 릴리즈를 혼합하는 것을 시도하고 있기 때문에 즉 발견 된 일부 인터넷 검색 후

error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in test1.obj 

을, 나는 아마 디버그 모드에서 라이브러리를 컴파일하거나 그렇지 않으면 _ITERATOR_DEBUG_LEVEL 매크로와 혼란한다 : 그럼 얻었다. 그러나 그 것이 권장 된 방법이고 왜 그런지 궁금합니다. 필자가 사용하고자하는 모든 타사 라이브러리에 대한 릴리스 및 디버그 바이너리 모두를 컴파일하고 보관해야하는 번거 로움이 있습니다.이 코드로 디버깅 할 의도는 없지만 곧 많은 작업이 수행됩니다.

+0

이 타사에 연락하여 디버그 버전을 얻거나 직접 디버그 버전을 빌드 할 수 있습니까? –

+0

그것은 나쁜 습관 이상의 것입니다 : 프로그램이 충돌하거나 나쁜 일을하는 것을 거의 보장합니다. VS2010 이전에는 런타임에 이상한 버그를 발견하기 위해 어쨌든 연결할 수있었습니다. 적어도 이제는 네가 막을 수있다. –

+1

@JesseGood 예 소스 코드가 있는데 방금 디버그 버전을 컴파일했습니다. 문제 해결됨. 한 모드를 컴파일하고 추적 할 수 있는지 궁금합니다. 명백하게! –

답변

26

디버깅 코드와 릴리스 코드를 혼용하는 것은 좋지 않습니다. 문제는 다른 버전이 C++ 런타임 라이브러리의 다른 기본 부분에 의존 할 수 있다는 것입니다. 예를 들어 메모리가 할당되는 방식, 반복자와 같은 구조가 다를 수 있으며 작업을 수행하기 위해 추가 코드가 생성 될 수 있습니다 (예 : 반복자 검사).

다른 설정으로 빌드 된 라이브러리 파일을 혼합하는 것과 같습니다. 헤더 파일에 응용 프로그램과 라이브러리에서 사용되는 구조가 포함되어있는 경우를 생각해보십시오. 라이브러리는 구조 패킹 및 정렬을 한 값으로 설정하고 응용 프로그램을 다른 값으로 작성하여 작성됩니다. 응용 프로그램의 구조를 라이브러리로 전달하는 것이 크기와 멤버 위치가 다를 수 있기 때문에 작동한다는 보장은 없습니다.

타사 라이브러리를 DLL로 빌드 할 수 있습니까? 어떤 함수에 대한 인터페이스가 더 깔끔하고 STL 객체를 전달하려고하지 않는다면 디버그 애플리케이션을 문제없이 릴리스 DLL과 혼합 할 수 있습니다.

+0

특히 std 컨테이너와 iterator는 서로 다르며 호환되지 않습니다. 그것은 당신이 보았던 검사입니다 : 그것은 여분의 필드를 추가하여 반복자의 레이아웃에 영향을 미칩니다. std :: string stuff (only)는 Debug와 Release 사이의 호환성을 지원하지만 stl의 다른 요소는 전혀 작동하지 않습니다. –

+2

@ JDługosz std :: string은 런타임간에 명시 적으로 호환되지 않습니다. 재미있는 연습은'__declspec (dllexport) std :: string make_string()'함수 만있는 DLL을 만들고 Debug에서 빌드 한 다음 Release 실행 파일을 빌드하고 링크하고 함수를 호출하는 것입니다. 리턴 된 스트링'std :: cout'을 시도했을 때, 결과적으로 발생하는 크래시는 상당히 극적이었습니다. 이것은 VS2013을 사용하고 있지만 VS2010에는 확실히 문제가 있었으며 다른 버전도 기대합니다. [다음은] (https://blogs.msdn.microsoft.com/vcblog/2014/06/10/the-great-c-runtime-crt-refactoring/) 말의 입에서 나온 작은 정보. – Rai

+0

글쎄, 내가 팠던 특정 버전은 디버깅을하고 std 문자열 (반복자 또는 값, 더 이상 기억할 수없는)을 호환 할 수있는 코드를 가지고있다. 나는 VS2010보다 오래되었음을 알고 있지만, 정확히 얼마나 오래되었는지는 기억하지 못합니다. –

5

컴파일되지 않는다는 사실은 나쁜 습관임을 입증하기에 충분해야합니다.

별도의 빌드 유지에 관해서는 그렇게하지 않아도됩니다. 이전에 나를 위해 일한 해결 방법은 다음과 같습니다.

#ifdef _DEBUG 
#define DEBUG_WAS_DEFINED 
#undef _DEBUG 
#endif 

#include <culprit> 

#ifdef DEBUG_WAS_DEFINED 
#define _DEBUG 
#endif 

이 기능이 작동하는지 알려주세요.

관련 문제