hata LNK2038: '_ITERATOR_DEBUG_LEVEL' için uyuşmazlık algılandı: '0' değeri main.obj'deki '2' değeriyle eşleşmiyor


131

Sorunuma birçok çözüm okudum ama hiçbiri yardımcı olmadı. Temizlemeyi, yeniden inşa etmeyi denedim. Visual 2010 yeniden yüklendi ve profesyonelden en üst düzeye değiştirildi. Ama yine de neden bu hatayı aldığımı bilmiyorum. Projem şöyle görünüyor: Statik kitaplığımı test etmek için 1 Exe Çözümü. 1 Dll Çözümü statik kitaplığı. Dll'ye dönüştürülen kod ClassificationFramework adlı 1 lib'den gelen işlevi kullanıyor. Bu kitaplığı başlık olarak ve cpp olarak sağladım, yani temelde kaynak kodu. Exe çözümünde oluşturduğum kitaplığı + çalıştırmak için diğer bazı kitaplıkları + ClassificationFramework.dll'yi bağladım. Release'i kullandığımda her şey yolunda gidiyor, ancak Debug olarak değiştirdiğimde (çünkü bazı şeylerde hata ayıklamak istiyorum, yayın modunda hata ayıklayıcıyı atlamaktan yoruldum) şunu alıyorum:

    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

Sürümde derlediğimde şu uyarıları da alıyorum:

    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

Hata Ayıklayıcı'nın pdb dosyalarına giden yanlış yol nedeniyle atladığını buldum.

'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).

Debug-> Windows-> Modules'e gittiğimde o pdb dosyalarını falan bulamadığını görüyorum. O dosyaların burada ve burada olduğunu ona nasıl söyleyebilirim? MSvisual'ı yönetici olarak çalıştırmayı denedim ama bu da yardımcı olmadı. Pdb dosyalarını yüklemek için microsoft server kullandım ama yardımcı olmadım.

Yanıtlar:


148

VS2010'da yineleyici hata ayıklama düzeyi, hata ayıklamada varsayılan olarak 2'dir ve sürümde devre dışı bırakılır. Kullanmakta olduğunuz dll'lerden birinde yineleyici hata ayıklama işlemi büyük olasılıkla hata ayıklamada kapatılmıştır, çünkü bu görsel stüdyonun eski bir sürümünde inşa edilmiştir veya tanımları projeye açıkça eklediler.

Bunları arayın _ITERATOR_DEBUG_LEVELve _SECURE_SCLkaldırın veya tüm projelerde ve kaynaklarda uygun şekilde ayarlayın ve her şeyi yeniden oluşturun.

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

Kısacası, muhtemelen sürüm ve hata ayıklama dll'lerini karıştırıyorsunuz. Hata ayıklamada veya tam tersi sürüm dll'lerine bağlantı vermeyin!


6
Hiçbir .h veya .cpp dosyasında _ITERATOR_DEBUG_LEVEL veya _SECURE_SCL'den herhangi birini görmüyorum Sadece obj dosyalarında şu şekilde var: / FAILIFMISMATCH: "_ ITERATOR_DEBUG_LEVEL = 0" Peki ya
Qbunia

Sürümde hata ayıklayıcıya göre kesme noktalarını atlamaya ne dersiniz? Bazı kesme noktaları doldurulmuyor ve hata ayıklayıcının optimizasyon veya buna benzer bir şeyi birbirine bağlamadan dolayı bunlardan kaçındığını söylüyor
Qbunia

42
"Kısacası muhtemelen sürüm ve hata ayıklama dll'lerini karıştırıyorsunuz" bana yardımcı oldu. Teşekkürler!
Maksimum

2
Waiwaiwait! Bana MSVC'yi kullanırken, bir Hata Ayıklama derlemesi elde etmek için TÜM bağımlılıkları yeniden derlemem gerektiğini mi söylüyorsunuz? Hata ayıklamak istemediğim kişiler bile mi? Ne boktan adam! Buna inanamıyorum!
Michael

1
"Kısacası, muhtemelen sürüm ve hata ayıklama dll'lerini karıştırıyorsunuz" -> Benim durumumda RuntimeLibrary, MultiThreadedDLL olması gerektiği halde Release yapısında MultiThreadedDebugDLL idi.
Captain Normal

108

Eski Visual 6 projesini Visual Studio 2012'ye taşıdıktan sonra statik kitaplığa bağlanan bir uygulamada bugün aynı hatayı aldığım için bu konuda küçük bir güncelleme yapıyorum.

Benim durumumda hata Yanlışlıkla ile statik lib Yayın sürümünü derlenmiş olmasıydı / MDD yerine / MD uygulamasıdır, oysa / MD açıklamasında. Statik kitaplık projesinde doğru / MD'nin ayarlanması sorunu çözdü.

Bu Proje özelliklerinde yapılır

  • Seç Yapılandırma Özellikleri / C C ++ / Kod Üretimi ağacında
  • ve Runtime Library seçeneği tüm bağımlılık projeleriniz ve uygulamanız için aynıdır.

21

Yayımdaki A projenizi bilerek Hata Ayıklama'daki başka bir B projesine bağlamak istiyorsanız, örneğin hata ayıklama sırasında uygulamanızın genel performans avantajlarını koruyun, o zaman büyük olasılıkla bu hataya çarpacaksınız. Yineleyici hata ayıklamasını devre dışı bırakmak (ve proje A ile eşleşmesini sağlamak için) B projesinin ön işlemci bayraklarını geçici olarak değiştirerek bunu düzeltebilirsiniz:

Proje B'nin "Hata Ayıklama" özelliklerinde, Configuration Properties -> C / C ++ -> Preprocessor, Preprocessor Definitions için aşağıdakileri ekleyin:

_HAS_ITERATOR_DEBUGGING = 0; _ITERATOR_DEBUG_LEVEL = 0;

Hata Ayıklama'da B projesini yeniden oluşturun, ardından Sürüm'de A projesi oluşturun ve doğru şekilde bağlanmalıdır.


11

Projeler arasında bir uyumsuzluk yaşadım: biri çok baytlı karakter setiyle, diğeri Unicode ile. Unicode üzerinde anlaşmak için bunları düzeltmek sorunu düzeltti.


2
Oluşturmaya çalıştığım projenin bu sorunu ve hata ayıklamada beklenmedik bir eksik önişlemci olduğu ortaya çıktı: _DEBUG. Bkz forums.codeguru.com/...
JGeerWM

Matlab'da mexing yaparken benzer bir sorun yaşadım, ancak tam tersi: Anlaşmayı almak için VS2013 yapısını çok bayta değiştirmem gerekiyordu. Bu aynı zamanda RuntimeLIbrary için bir uyuşmazlığı da çözdü.
barnhillec

10

Hata, aynı yürütülebilir dosyada veya dll'de hata ayıklama yapılarının karıştırılması ve sürüm yapılarının karıştırılmasıyla ortaya çıkabilir.

  1. vs yapılandırma yöneticisinde, projelerinizden bazıları hata ayıklama modunda ve bazıları yayın modunda mı?
  2. yayın projelerinizden biri DEBUG veya _DEBUG tanımlı önişlemci sembolüne sahip mi?
  3. hata ayıklama projelerinizden birinde önişlemci sembolü NDEBUG tanımlı mı?

7

Ben de bu sorunu yaşadım.

Benim sorunum, kitaplık içeren dizinleri hata ayıklama yapılandırmalarımdan kopyalayıp / yapıştırmamdı.

Bu nedenle "Indep" projesi, sürümde bile "../Debug" dan "Dep.lib" statik kitaplığını içeriyordu. Düzeltme, kitaplık dizinini "../Release" olarak değiştirmekti, bu yüzden önceden oluşturulmuş hata ayıklama kitaplığı yerine yayınlanmış kitaplığı yakaladım.


Statik kitaplığımın yayınlanması veya hata ayıklaması fark etmeksizin aynı yere indiği benzer bir sorun vardı. Bu durumda, bunlara 'd' veya böyle bir şey eklenerek farklı bir ad verilmelidir. Aksi takdirde, hata ayıklama / yayınlama arasında her geçiş yaptığınızda kitaplığı yeniden oluşturmak zorunda kalırsınız.
yau

4

Hata ayıklama ve sürüm kitaplıkları arasında aynı sorunu yaşadım. Hata, çözüm özellikleri / Yapılandırma özellikleri / Yapılandırmalardaydı.

Proje konfigürasyonları ana konfigürasyon / platform ile eşleşmedi.


3

C ++ proje özelliklerinde (Sürüm yapılandırması için) _DEBUG makro tanımını NDEBUG olarak değiştirmeyi deneyin (Sürüm yapılandırması için) Yapılandırma Özellikleri -> C / C ++ -> Ön İşlemci -> Ön İşlemci Tanımları


3

Son şans (diğer yollar işe yaramazsa): Tüm projelerde _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH makrosu tanımlayın. CRT başlıklarında kullanılan "#pragma detect_mismatch" özelliğini devre dışı bırakır.


Bu sayfadaki hemen hemen her şeyi denedim ve işe yarayan tek şey buydu. Ekle _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCHaltında C/C++ >> Preprocessor >> PreprocessorDefinitions.
Contango

2

opencv_core245.lib (dxt.obj): hata LNK2038: '_ITERATOR_DEBUG_LEVEL' için uyumsuzluk algılandı: '0' değeri test.obj'deki '2' değeriyle eşleşmiyor Böyle bir hata aldım.
Linker-> Input-> Ek bağımlılık içinde opencv_core245.lib ve opencv_core245d.lib var. Bu ikisi birbiriyle çeliştiğinden, ilk opencv_core245.lib'i kaldırdım. Hata gitti.


2

Şunu deneyin: Goto proje özelliği -> C / C ++ -> Kod oluşturma -> Çalışma Zamanı Kitaplığı Combobox değerinden seçin: Çok iş parçacıklı DLL (/ MD) Benim için çalışıyor :)


2

Benim durumumda, hem Debug hem de Release için çözüm, tüm çözümü temizleyip yeniden inşa etmekti.

Düzenleme: benim durumumda da doğru (VS2017) step1: projeyi temizle. step2: yapılandırma modunu değiştirin (hata ayıklamadan yayına veya tam tersi). step3: projeyi temizleyin. step4: gerekli yapılandırma modunu oluşturun.

Not: yapılandırma modunu değiştirmek için yapı menüsü altında yapılandırma ayarlarını bulun


1

Bugün aynı sorunu yaşadım (VS2010), Sürüm | Win32, sonra Debug | Win32 ve bu mesajı aldım.

Hata Ayıklamayı temizlemeyi denedim | Win32 ancak hata devam etti. Daha sonra temizledim Yayın | Win32, ardından Debug temizlendi | Win32 ve sonra iyi inşa edildi.


1

Bu hatayı (benim durumumda Ogre3D + Bullet kullanarak), bağımlılık kitaplıklarını Proje Özellikleri -> Bağlayıcı -> Giriş -> Ek Bağımlılıklar (VC10) içindeki hata ayıklama sürümlerine değiştirerek kurtulmayı başardım.

BulletCollision.lib'i BulletCollision_debug.lib (hata ayıklama yapılandırması için) olarak değiştirdim ve derledim.


1

"Ek Kütüphane Dizini" ni düzeltme sorunumu çözdüm, bu "$ (SolutionDir) \ Release" i belirtmekle yanlıştı, "$ (SolutionDir) \ $ (IntDir)" içinde değiştirdim

Düzeltmek için proje özelliklerinizi açın -> Yapılandırma Özellikleri -> Bağlayıcı -> Genel -> Ek Kitaplık Dizini

Umarım bu, aynı sorunu yaşayan bazı insanlara yardım eder;)


bu yüzden benim için Hata ayıklama iyi çalışıyor ancak sürümde derleme yaparken yukarıdaki hatayı alıyorum .... Bulduğum Ek Kitaplık Dizini'ni açtım: C: / Program Files / PCL 1.8.1 / lib / $ (Yapılandırma) şimdi ne eklemeliyim buraya?
sqp_125

0

Ben de bu sorunu yaşadım ve ortaya çıktı çünkü projeyi yeniden yaptım ve sonra onu bağımlı bir projede referansla yeniden bağlamayı unuttum.

Böylece yenisi yerine eski projeye atıfta bulunarak bağlanıyordu.

Önceden bağlanmış bir projenin referans olarak yeniden eklenmesinde bir hata olduğunu bilmek önemlidir. Vcxproj'deki referansı manuel olarak silmeniz gerekir ve ancak o zaman yeniden ekleyebilirsiniz. Bu, msdn'ye göre Visual Studio'da bilinen bir sorundur.


0

Benzer bir sorun yaşadım, ancak yanlış ayar, kaynakların olmadığı extern .lib dosyasındaydı. Kaynak dosyalara sahip değilseniz , en basit çözüm, .lib dosyasının içeriğini değiştirmektir.

Bir düzenleyicide .lib dosyasını açın (Ben PSPad'i kullanılan tomurcuk, Windows not defteri de mümkündür) ve tüm tekrarlarını değiştirmek _ITERATOR_DEBUG_LEVEL = 2 için = 0 _ITERATOR_DEBUG_LEVEL


0

Benim durumumda, "Önişlemci Tanımları" ndaki NDEBUG makro tanımının _DEBUG olarak değiştirilmesi gerekiyordu. Soruda listelenen hatayla aynı hatadan şikayet eden bir .exe'de kullanmak için statik bir kitaplık oluşturuyorum. Konfigürasyon Özellikleri'ne ("Proje" menüsü, "Özellikler" menü öğesi) gidin ve ardından C / C ++ bölümünü, ardından bunun altındaki Ön İşlemci bölümünü tıklayın ve ardından Önişlemci Tanımlarınızı düzenleyerek NDEBUG, _DEBUG olarak değiştirilir ( exe ayarı).


0

Diğer tüm cevaplar gibi Configuration Properties -> C/C++ -> Preprocessordirektiflerime baktım .
Benim durumumda ben NDEBUGdoğru Release tanımlanan, ama ben de vardı: _SECURE_SCL=1.

Bunu kaldırmak sorunu çözdü.


-1

Yukarıdaki yardıma küçük bir ek: VST 2017 kullanarak eski bir VST çözümüne statik bir libto ekledikten sonra uyuşmazlık hatası aldım. VST artık bu 2 satırı içeren önceden derlenmiş başlıklar için "stdfax.h" oluşturur:

// Turn off iterator debugging as it makes the compiler very slow on large methods in debug builds
#define _HAS_ITERATOR_DEBUGGING 0
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.