오류 LNK2038 : '_ITERATOR_DEBUG_LEVEL'에 대해 불일치가 감지되었습니다. 값 '0'이 (가) main.obj의 '2'값과 일치하지 않습니다.


131

내 문제에 대한 많은 해결책을 읽었지만 아무런 도움이되지 않았습니다. 나는 깨끗하고 재건을 시도했다. Visual 2010을 다시 설치하고 Professional에서 Ultimate으로 변경하십시오. 그러나 여전히이 오류가 발생하는 이유를 모르겠습니다. 내 프로젝트는 다음과 같습니다. 1 정적 라이브러리를 테스트하는 Exe Solution. 1 Dll 솔루션 정적 라이브러리. dll로 변환 된 코드는 ClassificationFramework라는 1 lib의 함수를 사용하고 있습니다. 나는이 lib를 헤더와 cpp로 기본적으로 소스 코드로 제공했다. Exe 솔루션에서 생성 된 라이브러리 + 다른 라이브러리를 연결하여 ClassificationFramework.dll을 실행했습니다. 릴리스를 사용할 때 모든 것이 잘 작동하지만 디버그로 변경하면 (일부 디버깅을 원하기 때문에 릴리스 모드에서 디버거를 건너 뛰는 데 피곤합니다) 다음과 같이 나타납니다.

    2>Link:
    2>  ClassificationFramework.lib(SampleClass.obj) : MSIL .netmodule or module compiled with /GL found; restarting link with /LTCG; add /LTCG to the link command line to improve linker performance
    2>ClassificationFramework.lib(SampleClass.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
    2>ClassificationFramework.lib(SampleNamesSet.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
    2>ClassificationFramework.lib(SampleSet.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
    2>ClassificationFramework.lib(DirectoryReader.obj) : error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in main.obj
    2>LINK : warning LNK4098: defaultlib 'MSVCRT' conflicts with use of other libs; use /NODEFAULTLIB:library
    2>C:\Documents and Settings\Administrator\My Documents\Visual Studio 2010\Projects\Transformer\Debug\Tester.exe : fatal error LNK1319: 4 mismatches detected

릴리스에서 빌드 할 때 다음 경고도 표시됩니다.

    1>Link:
    1>  Generating code
    1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(101): warning C4748: /GS can not protect parameters and local variables from local buffer overrun because ptimizations are disabled in function
    1>c:\users\kasia\documents\visual studio 2010\projects\classificationframework\classificationframework\directoryreader.cpp(30): warning C4748: /GS can not protect parameters and local variables from local buffer overrun because optimizations are disabled in function
    1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\xstring(1589): warning C4748: /GS can not protect parameters and local variables from local buffer overrun because optimizations are disabled in function
    1>c:\users\kasia\documents\visual studio 2010\projects\classificationframework\classificationframework\samplenamesset.cpp(226): warning C4748: /GS can not protect parameters and local variables from local buffer overrun because optimizations are disabled in function
    1>c:\users\kasia\documents\visual studio 2010\projects\classificationframework\classificationframework\directoryreader.cpp(60): warning C4748: /GS can not protect parameters and local variables from local buffer overrun because optimizations are disabled in function
    1>c:\users\kasia\documents\visual studio 2010\projects\classificationframework\classificationframework\samplenamesset.cpp(199): warning C4748: /GS can not protect parameters and local variables from local buffer overrun because optimizations are disabled in function
    1>c:\users\kasia\documents\visual studio 2010\projects\classificationframework\classificationframework\sampleset.cpp(27): warning C4748: /GS can not protect parameters and local variables from local buffer overrun because optimizations are disabled in function
    1>c:\users\kasia\documents\visual studio 2010\projects\classificationframework\classificationframework\samplenamesset.cpp(59): warning C4748: /GS can not protect parameters and local variables from local buffer overrun because optimizations are disabled in function
    1>  Finished generating code
    1>ClassificationFramework.lib(SampleSet.obj) : warning LNK4099: PDB 'vc100.pdb' was not found with 'ClassificationFramework.lib(SampleSet.obj)' or at 'C:\Documents and Settings\Administrator\My Documents\Visual Studio 2010\Projects\Transformer\Release\vc100.pdb'; linking object as if no debug info
    1>ClassificationFramework.lib(SampleNamesSet.obj) : warning LNK4099: PDB 'vc100.pdb' was not found with 'ClassificationFramework.lib(SampleNamesSet.obj)' or at 'C:\Documents and Settings\Administrator\My Documents\Visual Studio 2010\Projects\Transformer\Release\vc100.pdb'; linking object as if no debug info
    1>ClassificationFramework.lib(SampleClass.obj) : warning LNK4099: PDB 'vc100.pdb' was not found with 'ClassificationFramework.lib(SampleClass.obj)' or at 'C:\Documents and Settings\Administrator\My Documents\Visual Studio 2010\Projects\Transformer\Release\vc100.pdb'; linking object as if no debug info
    1>ClassificationFramework.lib(DirectoryReader.obj) : warning LNK4099: PDB 'vc100.pdb' was not found with 'ClassificationFramework.lib(DirectoryReader.obj)' or at 'C:\Documents and Settings\Administrator\My Documents\Visual Studio 2010\Projects\Transformer\Release\vc100.pdb'; linking object as if no debug info
    1>  Tester.vcxproj -> C:\Documents and Settings\Administrator\My Documents\Visual Studio 2010\Projects\Transformer\Release\Tester.exe

pdb 파일의 경로가 잘못되어 디버거가 건너 뛴다는 것을 알았습니다.

'Tester.exe': Loaded 'C:\Documents and Settings\Administrator\My Documents\Visual Studio 2010\Projects\Work\Release\Tester.exe', Symbols loaded.
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\kernel32.dll', Cannot find or open the PDB file
'Tester.exe': Unloaded 'C:\WINDOWS\SysWOW64\kernel32.dll'
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\ntdll.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\kernel32.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\OpenCV2.2\bin\opencv_core220.dll', Binary was not built with debug information.
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\msvcp100.dll', Symbols loaded.
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\msvcr100.dll', Symbols loaded.
'Tester.exe': Loaded 'C:\OpenCV2.2\bin\opencv_highgui220.dll', Binary was not built with debug information.
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\user32.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\gdi32.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\advapi32.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\rpcrt4.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\secur32.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\ole32.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\msvcrt.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_5.82.3790.4770_x-ww_A689AB02\comctl32.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\avifil32.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\winmm.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\msacm32.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\msvfw32.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\shell32.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\shlwapi.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\avicap32.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\version.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\OpenCV2.2\bin\opencv_imgproc220.dll', Binary was not built with debug information.
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\imm32.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\lpk.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\SysWOW64\usp10.dll', Cannot find or open the PDB file
'Tester.exe': Loaded 'C:\WINDOWS\WinSxS\wow64_Microsoft.Windows.Common-        Controls_6595b64144ccf1df_6.0.3790.4770_x-ww_8D2E3180\comctl32.dll', Cannot find or open the PDB file
The program '[4984] Tester.exe: Native' has exited with code 0 (0x0).

디버그-> Windows-> 모듈로 이동하면 해당 pdb 파일 또는 무언가를 찾을 수 없음을 알 수 있습니다. 그 파일들이 여기와 여기에 있다고 어떻게 말할 수 있습니까? MSvisual을 관리자로 실행하려고 시도했지만 너무 도움이되지 않았습니다. Microsoft 서버를 사용하여 pdb 파일을로드했지만 도움이되지 않았습니다.

답변:


148

VS2010에서는 반복자 디버그 수준이 디버그에서 기본적으로 2로 설정되고 릴리스에서 비활성화됩니다. 사용중인 dll 중 하나는 이전 버전의 Visual Studio에서 빌드되었거나 프로젝트에 정의를 명시 적으로 추가했기 때문에 디버그에서 반복자 디버깅이 해제되었을 수 있습니다.

모든 프로젝트와 소스에서 검색 _ITERATOR_DEBUG_LEVEL하고 _SECURE_SCL제거하거나 적절하게 설정하고 모든 것을 재구성하십시오.

_ITERATOR_DEBUG_LEVEL = 0 // disabled (for release builds)
_ITERATOR_DEBUG_LEVEL = 1 // enabled (if _SECURE_SCL is defined)
_ITERATOR_DEBUG_LEVEL = 2 // enabled (for debug builds)

요컨대 릴리스 및 디버그 dll을 혼합하고있을 것입니다. 릴리스 dll을 디버그 또는 그 반대로 링크하지 마십시오!


6
/ FAILIFMISMATCH : 나는 어떤 그들은 단지로 OBJ 파일에 존재 _ITERATOR_DEBUG_LEVEL 또는 _SECURE_SCL의 .H 또는 .CPP 파일에 표시 해달라고 "_ ITERATOR_DEBUG_LEVEL 0 ="무엇에 대한
Qbunia

릴리스에서 디버거가 중단 점을 건너 뛰는 것은 어떻습니까? 일부 중단 점은 채워지지 않았으며 디버거는 최적화 또는 이와 같은 링크로 인해이를 피할 수 있다고 말합니다
Qbunia

42
"간단히 말해서 당신은 아마도 릴리스와 디버그 dll을 혼합하고있을 것입니다"라고 도와주었습니다. 감사!
Max

2
와 이와이 웨이트! MSVC를 사용할 때 디버그 빌드를 얻으려면 모든 종속성을 다시 컴파일해야한다고 말합니까? 심지어 내가 신경 쓰지 않는 것조차? 무슨 짓이야! 나는 이것을 믿을 수 없다!
Michael

1
"간단히 말하면 릴리스와 디버그 dll을 혼합하는 것입니다."-> 내 경우에 RuntimeLibrary는 MultiThreadedDLL이어야 할 때 릴리스 빌드에서 MultiThreadedDebugDLL이었습니다.
Captain Normal

108

이전 Visual 6 프로젝트를 Visual Studio 2012로 마이그레이션 한 후 정적 라이브러리에 대해 링크하는 응용 프로그램에서 오늘 같은 오류가 발생했기 때문에이 문제에 대해 약간 업데이트했습니다.

필자의 경우 오류는 / MD 대신 / MDd를 사용 하여 정적 lib의 릴리스 버전을 실수로 컴파일하는 반면 응용 프로그램은 릴리스의 / MD 입니다. 정적 lib 프로젝트에서 올바른 / MD를 설정하면 문제가 해결되었습니다.

이것은 프로젝트 속성 에서 수행됩니다.

  • 선택 구성 속성 / C C ++ / 코드 생성을 트리에
  • 런타임 라이브러리 옵션 은 모든 종속성 프로젝트 및 응용 프로그램에서 동일하게 설정됩니다.

21

릴리스의 프로젝트 A를 디버그의 다른 프로젝트 B와 의도적으로 연결하려면 디버깅하는 동안 응용 프로그램의 전반적인 성능 이점을 유지한다고 말하면이 오류가 발생할 수 있습니다. 프로젝트 B의 전 처리기 플래그를 임시로 수정하여 반복자 디버깅을 비활성화하고 프로젝트 A와 일치하게하여이 문제를 해결할 수 있습니다.

프로젝트 B의 "디버그"특성, 구성 특성-> C / C ++-> 전 처리기에서 전 처리기 정의에 다음을 추가하십시오.

_HAS_ITERATOR_DEBUGGING = 0; _ITERATOR_DEBUG_LEVEL = 0;

디버그에서 프로젝트 B를 다시 빌드 한 다음 릴리스에서 프로젝트 A를 빌드하면 올바르게 링크되어야합니다.


11

프로젝트 사이에 불일치가 있습니다. 하나는 멀티 바이트 문자 세트이고 다른 하나는 유니 코드입니다. 유니 코드에 동의하도록이를 수정하면 문제가 해결되었습니다.


2
내가 빌드하려고했던 프로젝트 에이 문제가 있었으며 디버그에서 예기치 않은 누락 된 전 처리기 _DEBUG가있는 것으로 나타났습니다. forums.codeguru.com/…
JGeerWM

Matlab에서도 비슷한 문제가 있었지만 다른 방법은 VS2013 빌드를 멀티 바이트로 변경하여 계약을 체결해야했습니다. 또한 RuntimeLIbrary의 불일치를 해결했습니다.
barnhillec

10

동일한 실행 파일 또는 dll에서 디버그 빌드와 릴리스 빌드를 함께 혼합하면 오류가 발생할 수 있습니다.

  1. vs 구성 관리자에서 일부 프로젝트는 디버그 모드이고 일부는 릴리스 모드입니까?
  2. 릴리스 프로젝트 중 하나에 사전 처리기 기호 DEBUG 또는 _DEBUG가 정의되어 있습니까?
  3. 디버그 프로젝트 중 하나에 사전 처리기 기호 NDEBUG가 정의되어 있습니까?

7

나도이 문제가 있었다.

내 문제는 라이브러리 포함 디렉토리를 디버그 구성에서 복사 / 붙여 넣었다는 것입니다.

따라서 "Indep"프로젝트에는 릴리스 된 경우에도 "../Debug"의 정적 라이브러리 "Dep.lib"가 포함되었습니다. 수정은 라이브러리 디렉토리를 "../Release"로 변경하여 이전에 빌드 된 디버그 라이브러리가 아닌 릴리스 빌드 라이브러리를 발견했습니다.


비슷한 문제가있어서 정적 lib가 릴리스 또는 디버그 여부에 관계없이 동일한 위치에 도달했습니다. 이 경우 'd'등을 추가하여 이름을 다르게 지정해야합니다. 그렇지 않으면 디버그 / 릴리스간에 전환 할 때마다 lib를 다시 작성해야합니다.
yau

4

디버그 라이브러리와 릴리스 라이브러리간에 동일한 문제가있었습니다. 솔루션 속성 / 구성 속성 / 구성에 실수가있었습니다.

프로젝트 구성이 기본 구성 / 플랫폼과 일치하지 않았습니다.


3

C ++ 프로젝트 특성 (릴리스 구성의 경우)에서 _DEBUG를 NDEBUG 매크로 정의로 변경하십시오. 구성 특성-> C / C ++-> 전 처리기-> 전 처리기 정의


3

마지막 기회 (다른 방법으로 작동하지 않는 경우) : 모든 프로젝트에서 _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH 매크로를 정의하십시오. CRT 헤더에 사용되는 "#pragma detect_mismatch"기능을 비활성화합니다.


이 페이지에서 거의 모든 것을 시도했지만 이것이 유일한 효과였습니다. _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH아래에 추가하십시오 C/C++ >> Preprocessor >> PreprocessorDefinitions.
Contango

2

opencv_core245.lib (dxt.obj) : 오류 LNK2038 : '_ITERATOR_DEBUG_LEVEL'에 대한 불일치가 감지되었습니다. test.obj의 '0'값이 '2'값과 일치하지 않습니다. 이와 같은 오류가 발생했습니다.
링커-> 입력-> 추가 종속성에 opencv_core245.lib 및 opencv_core245d.lib가 있습니다. 이 두 가지가 상충되었으므로 첫 번째 opencv_core245.lib를 제거했습니다. 오류가 발생했습니다.


2

이것을보십시오 : Goto 프로젝트 속성-> C / C ++-> 코드 생성-> 런타임 라이브러리 콤보 상자 값에서 선택하십시오 : 멀티 스레드 DLL (/ MD) 그것은 나를 위해 작동합니다 :)


2

필자의 경우 디버그 및 릴리스 모두 솔루션은 전체 솔루션을 정리하고 다시 작성하는 것이 었습니다.

편집 : 내 경우에도 true (VS2017) step1 : 프로젝트를 정리하십시오. 2 단계 : 구성 모드 변경 (디버그에서 릴리스로 또는 그 반대로). 3 단계 : 프로젝트를 청소하십시오. step4 : 필수 구성 모드에서 빌드하십시오.

추신 : 구성 모드를 변경하려면 빌드 메뉴에서 구성 설정을 찾으십시오.


1

오늘도 같은 문제가 발생했습니다 (VS2010). Release | 그런 다음 Win32는 디버그 | Win32 및이 메시지가 나타납니다.

디버그 청소를 시도했습니다 | Win32이지만 오류가 계속 발생했습니다. 그런 다음 릴리스를 청소했습니다 | Win32, 그런 다음 디버그 | Win32 그리고 잘 빌드되었습니다.


1

프로젝트 속성-> 링커-> 입력-> 추가 종속성 (VC10)에서 종속성 라이브러리를 디버그 버전으로 변경 하여이 오류 (내 경우에는 Ogre3D + Bullet 사용)를 제거했습니다.

BulletCollision.lib를 BulletCollision_debug.lib (디버그 구성 용)로 변경하고 컴파일했습니다.


1

"추가 라이브러리 디렉토리"를 수정하는 데 문제가 해결되었습니다. "$ (SolutionDir) \ Release"를 나타내는 데 잘못되었습니다. "$ (SolutionDir) \ $ (IntDir)"에서 변경했습니다.

이를 정정하려면 프로젝트 특성-> 구성 특성-> 링커-> 일반-> 추가 라이브러리 디렉토리를여십시오.

나는 이것이 같은 문제로 일부 사람들을 도울 수 있기를 바랍니다.)


그래서 나를 위해 디버그는 잘 작동하지만 릴리스에서 빌드 할 때 위의 오류가 발생합니다 .... 추가 라이브러리 디렉토리를 열었습니다. C : / Program Files / PCL 1.8.1 / lib / $ (Configuration) 추가해야 할 내용 여기?
sqp_125

0

또한이 문제가 있었고 프로젝트를 다시 만든 다음 종속 프로젝트에서 참조로 다시 연결하는 것을 잊었 기 때문에 발생했습니다.

따라서 새 프로젝트 대신 이전 프로젝트를 참조하여 연결되었습니다.

이전에 링크 된 프로젝트를 참조로 다시 추가 할 때 버그가 있음을 아는 것이 중요합니다. vcxproj에서 참조를 수동으로 삭제하고 다시 추가 할 수 있습니다. msdn에 따르면 Visual Studio에서 알려진 문제입니다.


0

비슷한 문제가 있었지만 소스가없는 extern .lib 파일에 잘못된 설정이 있습니다. 소스 파일이없는 경우 가장 간단한 해결 방법은 .lib 파일의 내용을 변경하는 것입니다.

편집기에서 .lib 파일을 열고 (PSPad를 사용했으며, Windows 메모장을 사용할 수도 있습니다) _ITERATOR_DEBUG_LEVEL = 2 의 모든 발생 을 _ITERATOR_DEBUG_LEVEL = 0 으로 바꿉니다.


0

필자의 경우 "전 처리기 정의"의 NDEBUG 매크로 정의를 _DEBUG로 변경해야했습니다. 질문에 나열된 매우 동일한 오류에 대해 불평하는 .exe에서 사용할 정적 라이브러리를 작성 중입니다. 구성 속성 ( "프로젝트"메뉴, "속성"메뉴 항목)으로 이동 한 다음 C / C ++ 섹션을 클릭 한 다음 그 아래의 전 처리기 섹션을 클릭하고 NDEBUG가 _DEBUG로 변경되도록 전 처리기 정의를 편집하십시오 ( exe에서 설정).


0

다른 모든 답변과 마찬가지로 Configuration Properties -> C/C++ -> Preprocessor지시어도 확인했습니다 .
필자의 경우 NDEBUGRelease 에서 올바르게 정의되었지만 다음과 같이했습니다 _SECURE_SCL=1.

그 중 하나를 제거하면 문제가 해결되었습니다.


-1

위의 도움말에 작은 추가 사항 : VST 2017을 사용하여 정적 libto를 이전 VST 솔루션에 추가 한 후 불일치 오류가 발생했습니다. VST는 이제 다음 두 줄을 포함하는 미리 컴파일 된 헤더에 대해 "stdfax.h"를 생성합니다.

// Turn off iterator debugging as it makes the compiler very slow on large methods in debug builds
#define _HAS_ITERATOR_DEBUGGING 0
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.