error LNK2038: se detectó una falta de coincidencia para '_ITERATOR_DEBUG_LEVEL': el valor '0' no coincide con el valor '2' en main.obj

131

He leído muchas soluciones a mi problema pero ninguna me ayudó. Intenté limpiar, reconstruir. Vuelva a instalar Visual 2010 y cambie de profesional a último. Pero aún no sé por qué tengo este error. Mi proyecto se ve así: 1 Solución Exe para probar mi biblioteca estática. 1 Dll Solution biblioteca estática. El código que se convierte a dll está utilizando la función de 1 lib llamada ClassificationFramework. Proporcioné esta lib como encabezados y cpp, así que básicamente el código fuente. En la solución Exe, vinculé mi biblioteca generada + algunas otras bibliotecas para ejecutarla + ClassificationFramework.dll. Todo funciona bien cuando uso Release pero cuando cambio a Debug (porque quiero depurar algunas cosas, estoy cansado de omitir el depurador en modo de lanzamiento) me sale esto:

    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

Cuando construyo en Release también recibí estas advertencias:

    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

Descubrí que el depurador se salta debido a una ruta incorrecta a los archivos 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).

Cuando voy a Debug-> Windows-> Modules veo que no puede encontrar esos archivos pdb o algo así. ¿Cómo puedo decirle que esos archivos están aquí y aquí? Traté de ejecutar MSvisual como administrador, pero eso tampoco me ayudó. Utilicé el servidor microsoft para cargar archivos pdb pero tampoco me ayudó.

Qbunia
fuente

Respuestas:

148

En el iterador VS2010, el nivel de depuración predeterminado es 2 en la depuración y está deshabilitado en la versión. Uno de los dlls que está utilizando probablemente tiene la depuración del iterador desactivada en la depuración ya sea porque se creó en una versión anterior de Visual Studio o porque agregaron explícitamente las definiciones al proyecto.

Busque _ITERATOR_DEBUG_LEVELy _SECURE_SCLelimínelos o configúrelos adecuadamente en todos los proyectos y fuentes y reconstruya todo.

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

En resumen, probablemente esté mezclando dlls de liberación y depuración. ¡No vincules dlls de lanzamiento en depuración o viceversa!

AJG85
fuente
66
No veo en ningún archivo .h o .cpp ninguno de _ITERATOR_DEBUG_LEVEL o _SECURE_SCL. Solo existen en archivos obj como: / FAILIFMISMATCH: "_ ITERATOR_DEBUG_LEVEL = 0" ¿Qué pasa?
Qbunia
¿Qué pasa si se saltan puntos de interrupción por depurador en la versión? Algunos puntos de interrupción no se llenan y se dice depurador evitarlos debido a la vinculación de Optimización o algo así
Qbunia
42
"En resumen, probablemente estés mezclando dlls de liberación y depuración" me ayudó. ¡Gracias!
Max
2
Waiwaiwait! ¿Quiere decirme que cuando estoy usando MSVC, para obtener una compilación de depuración debo recompilar TODAS las dependencias? ¿Incluso aquellos que no me importan depurar? ¡Qué mierda hombre! No puedo creer esto!
Michael
1
"En resumen, probablemente esté mezclando dlls de liberación y depuración" -> En mi caso, RuntimeLibrary fue MultiThreadedDebugDLL en la versión de lanzamiento cuando debería haber sido MultiThreadedDLL.
Capitán Normal
108

Realizo una pequeña actualización sobre este problema, ya que hoy tuve el mismo error en una aplicación que se vincula con una lib estática, después de migrar el antiguo proyecto de Visual 6 a Visual Studio 2012.

En mi caso, el error fue que compilé por error la versión Release de la biblioteca estática con / MDd en lugar de / MD , mientras que la aplicación es / MD en el lanzamiento. Establecer el / MD correcto en el proyecto lib estático resolvió el problema.

Esto se hace en las propiedades del proyecto

  • Seleccione Propiedades de configuración / C C ++ / Generación de código en el árbol
  • y la opción Runtime Library establecida en la misma en todos sus proyectos y aplicaciones de dependencias.
Francis Pierot
fuente
21

Si desea vincular deliberadamente su proyecto A en versión con otro proyecto B en depuración, por ejemplo, para mantener los beneficios generales de rendimiento de su aplicación durante la depuración, es probable que encuentre este error. Puede solucionar esto modificando temporalmente los indicadores del preprocesador del proyecto B para deshabilitar la depuración del iterador (y hacer que coincida con el proyecto A):

En las propiedades "Depuración" del Proyecto B, Propiedades de configuración -> C / C ++ -> Preprocesador, agregue lo siguiente a las Definiciones de preprocesador:

_HAS_ITERATOR_DEBUGGING = 0; _ITERATOR_DEBUG_LEVEL = 0;

Reconstruya el proyecto B en Debug, luego construya el proyecto A en Release y debería vincularse correctamente.

Antonio Maiorano
fuente
11

Tuve una falta de coincidencia entre proyectos: uno con juego de caracteres de varios bytes, el otro con Unicode. Corregir estos para acordar Unicode corrigió el problema.

stoney
fuente
2
Resulta que el proyecto que estaba intentando construir tenía este problema, así como un inesperado preprocesador en depuración: _DEBUG. Ver foros.codeguru.com/…
JGeerWM
Tuve un problema similar en la combinación de Matlab, pero al revés: necesitaba cambiar la compilación VS2013 a varios bytes para obtener el acuerdo. Esto también resolvió una falta de coincidencia para RuntimeLIbrary.
barnhillec
10

El error puede ser causado al mezclar compilaciones de depuración y versiones de lanzamiento en el mismo ejecutable o dll.

  1. en el administrador de configuración vs, ¿algunos de sus proyectos están en modo de depuración y otros en modo de lanzamiento?
  2. ¿Es uno de sus proyectos de lanzamiento tiene el símbolo de preprocesador DEBUG o _DEBUG definido?
  3. ¿Es uno de sus proyectos de depuración el símbolo de preprocesador NDEBUG definido?
Aviad Rozenhek
fuente
7

Yo tuve este problema también.

Mi problema fue que había copiado / pegado la biblioteca que incluía directorios de mis configuraciones de depuración.

Así que el proyecto "Indep" incluía la biblioteca estática "Dep.lib" de "../Debug", incluso en el lanzamiento. La solución fue cambiar el directorio de la biblioteca a "../Release", por lo que capté la biblioteca compilada en versión en lugar de la biblioteca de depuración compilada anteriormente.

ArtHare
fuente
Tuve un problema similar, donde mi lib estática aterrizó en el mismo lugar, independientemente de si se lanzó o se depuró. En ese caso, uno debe nombrarlos de manera diferente agregando 'd' o algo así. De lo contrario, también se vería obligado a reconstruir la biblioteca cada vez que cambie entre depuración / liberación.
yau
4

Tuve el mismo problema entre las bibliotecas de depuración y lanzamiento. El error estuvo en las propiedades de la solución / Propiedades de configuración / Configuraciones.

Las configuraciones de los proyectos no coincidían con la configuración / plataforma principal.

Alstrice
fuente
3

Intente cambiar la definición de macro _DEBUG a NDEBUG en las propiedades del proyecto C ++ (para la configuración de lanzamiento) Propiedades de configuración -> C / C ++ -> Preprocesador -> Definiciones de preprocesador

AlexT
fuente
3

Última oportunidad (si otras formas no funcionan): defina la macro _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH en todos los proyectos. Deshabilitará la función "#pragma detect_mismatch" que se usa en los encabezados CRT.

Andrey
fuente
Intenté casi todo en esta página, y esto fue lo único que funcionó. Añadir _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCHdebajo C/C++ >> Preprocessor >> PreprocessorDefinitions.
Contango
2

opencv_core245.lib (dxt.obj): error LNK2038: se detectó una falta de coincidencia para '_ITERATOR_DEBUG_LEVEL': el valor '0' no coincide con el valor '2' en test.obj Recibí un error como este.
Tengo opencv_core245.lib y opencv_core245d.lib en Linker-> Input-> Additional dependenc. Como estos dos eran confusos, eliminé primero uno opencv_core245.lib. Error desaparecido

Vinit M
fuente
2

Pruebe esto: Ir a la propiedad del proyecto -> C / C ++ -> Generación de código -> Biblioteca de tiempo de ejecución Seleccionar del valor del cuadro combinado: DLL multiproceso (/ MD) Funciona para mí :)

Phạm Mạnh
fuente
2

En mi caso, tanto para Debug como para Release, la solución fue limpiar y luego reconstruir la solución completa.

Editar: verdadero en mi caso también (VS2017) paso1: limpiar el proyecto. Paso 2: cambiar el modo de configuración (de depuración a versión o viceversa). Paso 3: limpia el proyecto. Paso 4: construir en el modo de configuración requerido.

PD: para cambiar el modo de configuración, busque la configuración en el menú de compilación

Ionut V.
fuente
1

Tuve el mismo problema hoy (VS2010), construí Release | Win32, luego trató de construir Debug | Win32, y recibí este mensaje.

Intenté limpiar Debug | Win32 pero el error aún persiste. Luego limpié Release | Win32, luego limpió Debug | Win32, y luego se construyó bien.

GilesDMiddleton
fuente
1

Me las arreglé para deshacerme de este error (en mi caso usando Ogre3D + Bullet) cambiando las bibliotecas de dependencias a las versiones de depuración en Propiedades del proyecto -> Enlace -> Entrada -> Dependencias adicionales (VC10).

Cambié BulletCollision.lib a BulletCollision_debug.lib (para la configuración de depuración) y se compiló.

JTatie
fuente
1

Resolví mi problema al corregir el "Directorio de bibliotecas adicionales", este era incorrecto al indicar "$ (SolutionDir) \ Release", lo cambié en "$ (SolutionDir) \ $ (IntDir)"

Para corregirlo, abra las propiedades del proyecto -> Propiedades de configuración -> Vinculador -> General -> Directorio de bibliotecas adicionales

Espero que esto ayude a algunas personas con el mismo problema;)

ThierryV
fuente
entonces, para mí, la depuración funciona bien, pero al compilar en la versión aparece el error anterior ... Abrí el Directorio de bibliotecas adicionales y encontré: C: / Archivos de programa / PCL 1.8.1 / lib / $ (Configuración), ¿qué debo agregar ahora? ¿aquí?
sqp_125
0

También tuve este problema y surgió porque volví a hacer el proyecto y luego olvidé volver a vincularlo por referencia en un proyecto dependiente.

Por lo tanto, se vinculaba por referencia al proyecto anterior en lugar del nuevo.

Es importante saber que hay un error al volver a agregar un proyecto previamente vinculado por referencia. Debe eliminar manualmente la referencia en vcxproj y solo entonces puede volver a agregarla. Este es un problema conocido en Visual Studio según msdn.

AtomicBoolean
fuente
0

Tuve un problema similar, pero la configuración incorrecta estaba en el archivo externo .lib del que no tenía fuentes. Si no tiene los archivos de origen , la solución más simple es simplemente cambiar el contenido del archivo .lib.

Abra el archivo .lib en un editor (usé PSPad, el bloc de notas de Windows también es posible) y reemplace todas las ocurrencias de _ITERATOR_DEBUG_LEVEL = 2 a _ITERATOR_DEBUG_LEVEL = 0

nucas
fuente
0

En mi caso, la definición de macro NDEBUG en las "Definiciones de preprocesador" necesitaba cambiarse a _DEBUG. Estoy construyendo una biblioteca estática para usar en un archivo .exe que se quejaba del mismo error que aparece en la pregunta. Vaya a Propiedades de configuración (menú "Proyecto", elemento de menú "Propiedades") y luego haga clic en la sección C / C ++, luego en la sección Preprocesador debajo de eso, y luego edite sus Definiciones de preprocesador para que NDEBUG se cambie a _DEBUG (para que coincida con el ajuste en el exe).

Alyoshak
fuente
0

Como todas las otras respuestas, revisé mis Configuration Properties -> C/C++ -> Preprocessordirectivas.
En mi caso he tenido el NDEBUGdefinido correctamente en la versión, pero también tenía: _SECURE_SCL=1.

Eliminar eso solucionó el problema.

Seguro en sí mismo
fuente
-1

Pequeña adición a la ayuda anterior: recibí el error de desajuste después de agregar una libto estática a una solución VST anterior usando VST 2017. VST ahora genera "stdfax.h" para encabezados precompilados que contienen estas 2 líneas:

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