erro LNK2038: incompatibilidade detectada para '_ITERATOR_DEBUG_LEVEL': o valor '0' não corresponde ao valor '2' no main.obj

131

Eu li muitas soluções para o meu problema, mas nenhuma ajudou. Eu tentei limpar, reconstruir. Reinstale o visual 2010 e mude de profissional para final. Mas ainda não sei por que tenho esse erro. Meu projeto tem a seguinte aparência: 1 Exe Solution para testar minha biblioteca estática. Biblioteca estática de 1 solução de DLL. O código que é convertido em dll está usando a função de 1 lib chamada ClassificationFramework. Eu forneci essa lib como cabeçalhos e cpp, então basicamente código-fonte. Na solução Exe, vinculei minha biblioteca gerada + algumas outras bibliotecas para executá-la + ClassificationFramework.dll. Tudo funciona bem quando uso o Release, mas quando mudo para Debug (porque quero depurar algumas coisas, estou cansado de pular o depurador no modo de lançamento).

    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

Quando crio no Release, também recebi estes avisos:

    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

Descobri que o depurador ignora por causa do caminho errado para os arquivos 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).

Quando vou para Debug-> Windows-> Modules, vejo que ele não consegue encontrar esses arquivos pdb ou algo assim. Como posso dizer a ele que esses arquivos estão aqui aqui e aqui? Tentei executar o MSvisual como administrador, mas isso também não ajudou. Eu usei o servidor microsoft para carregar arquivos pdb, mas também não ajudou.

Qbunia
fonte

Respostas:

148

No nível de depuração do iterador do VS2010, o padrão é 2 em depuração e é desativado na versão. Uma das DLLs que você está usando provavelmente tem a depuração do iterador desativada na depuração, porque foi criada em uma versão mais antiga do visual studio ou eles adicionaram explicitamente as definições ao projeto.

Procure _ITERATOR_DEBUG_LEVELe _SECURE_SCLremova-os ou configure-os adequadamente em todos os projetos e fontes e reconstrua tudo.

_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)

Em resumo, você provavelmente está misturando DLLs de lançamento e depuração. Não ligue DLLs de lançamento em depuração ou vice-versa!

AJG85
fonte
6
Eu não ver em qualquer arquivo .h ou .cpp qualquer um dos _ITERATOR_DEBUG_LEVEL ou _SECURE_SCL Eles só existem na obj arquivos como: / FAILIFMISMATCH: "_ ITERATOR_DEBUG_LEVEL = 0" E
Qbunia
Que tal pular pontos de interrupção pelo depurador na versão? Alguns pontos de interrupção não são preenchidos e diz depurador evitá-los por causa da optimalization ou ligando algo assim
Qbunia
42
"Em suma, você provavelmente está misturando DLLs de lançamento e depuração" me ajudou. Obrigado!
Max
2
Waiwaiwait! Você quer me dizer que, quando estou usando o MSVC, para obter uma compilação de depuração, devo recompilar TODAS as dependências? Mesmo aqueles que eu não ligo para depurar? Que merda! Eu não acredito nisso!
Michael
1
"Em resumo, você provavelmente está misturando DLLs de liberação e depuração" -> No meu caso, a RuntimeLibrary era MultiThreadedDebugDLL na versão Release quando deveria ter sido MultiThreadedDLL.
Capitão Normal
108

Faço uma pequena atualização sobre esse problema, pois tive o mesmo erro hoje em um aplicativo vinculado a uma lib estática, depois de migrar o antigo projeto Visual 6 para o Visual Studio 2012.

No meu caso, o erro foi que eu compilei por engano a versão Release da lib estática com / MDd em vez de / MD , enquanto o aplicativo é / MD em release. A configuração do MD / correto no projeto estático da lib resolveu o problema.

Isso é feito nas propriedades do projeto

  • Selecione Propriedades de configuração / C C ++ / Geração de código na árvore
  • e a opção Runtime Library definida como a mesma em todos os seus projetos e aplicativos de dependências.
Francis Pierot
fonte
21

Se você deseja vincular seu projeto A propositalmente a outro projeto B na depuração, mantenha os benefícios gerais de desempenho do seu aplicativo durante a depuração, provavelmente ocorrerá esse erro. Você pode corrigir isso modificando temporariamente os sinalizadores de pré-processador do projeto B para desativar a depuração do iterador (e fazer com que ele corresponda ao projeto A):

Nas propriedades "Depurar" do Projeto B, Propriedades de configuração -> C / C ++ -> Pré-processador, adicione o seguinte às Definições de pré-processador:

_HAS_ITERATOR_DEBUGGING = 0; _ITERATOR_DEBUG_LEVEL = 0;

Recrie o projeto B no Debug, em seguida, crie o projeto A no Release e ele deve ser vinculado corretamente.

Antonio Maiorano
fonte
11

Eu tinha uma incompatibilidade entre projetos: um com conjunto de caracteres de vários bytes, o outro com Unicode. A correção destes para concordar com o Unicode corrigiu o problema.

stoney
fonte
2
Acontece que o projeto que eu estava tentando criar tinha esse problema e um pré-processador ausente inesperado na depuração: _DEBUG. Veja forums.codeguru.com/…
JGeerWM
Eu tive um problema semelhante no Matlab, mas o contrário: eu precisava mudar a compilação do VS2013 para vários bytes para obter o acordo. Isso também resolveu uma incompatibilidade para RuntimeLIbrary.
precisa saber é o seguinte
10

O erro pode ser causado pela mistura de compilações de depuração e compilações no mesmo executável ou dll.

  1. No vs Configuration Manager, alguns de seus projetos estão no modo de depuração e outros no modo de liberação?
  2. um de seus projetos de release possui o símbolo de pré-processador DEBUG ou _DEBUG definido?
  3. um de seus projetos de depuração possui o símbolo de pré-processador NDEBUG definido?
Aviad Rozenhek
fonte
7

Eu tive esse problema também.

Meu problema era que eu copiei / colei os diretórios de inclusão da biblioteca das minhas configurações de depuração.

Portanto, o projeto "Indep" estava incluindo a biblioteca estática "Dep.lib" de "../Debug", mesmo no lançamento. A correção foi alterar o diretório da biblioteca para "../Release", então eu peguei a biblioteca criada pelo release em vez da biblioteca de depuração criada anteriormente.

ArtHare
fonte
Teve um problema semelhante, onde minha lib estática foi parar no mesmo local, independentemente de lançamento ou depuração. Nesse caso, deve-se dar um nome diferente acrescentando 'd' ou algo assim. Caso contrário, você também será forçado a reconstruir a lib sempre que alternar entre depuração / lançamento.
yau 25/09/16
4

Eu tive o mesmo problema entre as bibliotecas de depuração e lançamento. O erro ocorreu nas propriedades da solução / Propriedades das configurações / Configurações.

As configurações do projeto não coincidiram com a principal configuração / plataforma.

Alstrice
fonte
3

Tente alterar a definição da macro _DEBUG para NDEBUG nas propriedades do projeto C ++ (para configuração da Versão) Propriedades de Configuração -> C / C ++ -> Pré-processador -> Definições do Pré-processador

AlexT
fonte
3

Última chance (se outras maneiras não funcionarem): defina a macro _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH em todos os projetos. Desabilitará o recurso "#pragma detect_mismatch" usado nos cabeçalhos CRT.

Andrey
fonte
Eu tentei praticamente tudo nesta página, e essa foi a única coisa que funcionou. Adicionar _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCHem C/C++ >> Preprocessor >> PreprocessorDefinitions.
Contango 16/04
2

opencv_core245.lib (dxt.obj): erro LNK2038: incompatibilidade detectada para '_ITERATOR_DEBUG_LEVEL': o valor '0' não corresponde ao valor '2' no test.obj Eu recebi um erro como este.
Eu tenho opencv_core245.lib e opencv_core245d.lib no vinculador-> entrada-> dependência adicional. Como esses dois eram conflitantes, removi o primeiro opencv_core245.lib. Erro desaparecido.

Vinit M
fonte
2

Tente isto: Vá para a propriedade do projeto -> C / C ++ -> Geração de código -> Biblioteca de Tempo de Execução Selecione no valor da caixa de combinação: DLL Multiencadeada (/ MD) Funciona para mim :)

Phạm Mạnh
fonte
2

No meu caso, para Debug e Release, a solução era limpar e reconstruir a solução inteira.

Edit: true no meu caso também (VS2017) step1: limpe o projeto. step2: altere o modo de configuração (de depuração para release ou vice-versa). passo 3: limpe o projeto. step4: construa no modo de configuração necessário.

PS: para alterar o modo de configuração, localize as configurações no menu build

Ionut V.
fonte
1

Eu tive o mesmo problema hoje (VS2010), criei Release | Win32, em seguida, tentou criar depuração | Win32, e recebi esta mensagem.

Eu tentei limpar o Debug | Win32, mas o erro ainda persistiu. Eu então limpei Release | Win32, depois limpo Debug | Win32 e, em seguida, ele construiu bem.

GilesDMiddleton
fonte
1

Consegui me livrar desse erro (no meu caso, usando o Ogre3D + Bullet) alterando as bibliotecas de dependência para as versões de depuração em Propriedades do projeto -> Vinculador -> Entrada -> Dependências adicionais (VC10).

Alterei BulletCollision.lib para BulletCollision_debug.lib (para configuração de depuração) e ele foi compilado.

JTatie
fonte
1

Resolvi meu problema ao corrigir o "Diretório de biblioteca adicional", este estava errado ao indicar "$ (SolutionDir) \ Release", mudei em "$ (SolutionDir) \ $ (IntDir)"

Para corrigi-lo, abra as propriedades do projeto -> Propriedades de Configuração -> Vinculador -> Geral -> Diretório Adicional de Bibliotecas

Espero que isso ajude algumas pessoas com o mesmo problema;)

ThierryV
fonte
Então, para mim, a depuração funciona bem, mas ao compilar na versão, recebo o erro acima .... Abri o Diretório de bibliotecas adicionais que encontrei: C: / Arquivos de programas / PCL 1.8.1 / lib / $ (Configuration) o que devo adicionar agora aqui?
Sqp_125 02/05/19
0

Eu também tive esse problema e surgiu porque refiz o projeto e esqueci de vinculá-lo novamente por referência em um projeto dependente.

Assim, foi vinculado por referência ao projeto antigo, em vez do novo.

É importante saber que há um erro ao adicionar novamente um projeto vinculado anteriormente por referência. Você precisa excluir manualmente a referência no vcxproj e só então pode adicioná-la novamente. Esse é um problema conhecido no Visual studio, de acordo com o msdn.

AtomicBoolean
fonte
0

Eu tive um problema semelhante, mas a configuração errada estava no arquivo .lib externo do qual eu não tinha fontes. Se você não possui os arquivos de origem , a solução mais simples é alterar apenas o conteúdo do arquivo .lib.

Abra o arquivo .lib em um editor (usei o PSPad, também é possível o bloco de notas do Windows) e substitua todas as ocorrências de _ITERATOR_DEBUG_LEVEL = 2 a _ITERATOR_DEBUG_LEVEL = 0

guardanapos
fonte
0

No meu caso, a definição da macro NDEBUG nas "Definições do pré-processador" precisava ser alterada para _DEBUG. Estou criando uma biblioteca estática para uso em um .exe que estava reclamando do mesmo erro listado na pergunta. Vá para Propriedades de configuração (menu "Projeto", item de menu "Propriedades") e clique na seção C / C ++, depois na seção Pré-processador abaixo disso e edite suas Definições de pré-processador para que NDEBUG seja alterado para _DEBUG (para coincidir com o configuração no exe).

Alyoshak
fonte
0

Como todas as outras respostas, verifiquei minhas Configuration Properties -> C/C++ -> Preprocessordiretrizes.
No meu caso, eu tinha o NDEBUGdefinido corretamente no Release, mas também tinha:_SECURE_SCL=1 .

A remoção desse problema corrigiu o problema.

Coxy
fonte
-1

Pequena adição à ajuda acima: recebi o erro de incompatibilidade após adicionar uma lib estática a uma solução VST mais antiga usando o VST 2017. O VST agora gera "stdfax.h" para cabeçalhos pré-compilados contendo estas 2 linhas:

// Turn off iterator debugging as it makes the compiler very slow on large methods in debug builds
#define _HAS_ITERATOR_DEBUGGING 0
FunctionPoint
fonte