kesalahan LNK2038: ketidakcocokan terdeteksi untuk '_ITERATOR_DEBUG_LEVEL': nilai '0' tidak cocok dengan nilai '2' di main.obj

131

Saya telah membaca banyak solusi untuk masalah saya tetapi tidak ada yang membantu. Saya mencoba membersihkan, membangun kembali. Diinstal ulang visual 2010 dan berubah dari profesional ke ultimate. Tetapi saya masih tidak tahu mengapa saya memiliki kesalahan ini. Proyek saya terlihat seperti ini: 1 Exe Solution untuk menguji perpustakaan statis saya. 1 Dll Solusi perpustakaan statis. Kode yang dikonversi ke dll menggunakan fungsi dari 1 lib disebut ClassificationFramework. Saya memberikan lib ini sebagai header dan cpp jadi pada dasarnya kode sumber. Dalam solusi Exe saya menautkan pustaka yang dihasilkan + beberapa lib lainnya untuk menjalankannya + ClassificationFramework.dll. Semuanya berfungsi dengan baik ketika saya menggunakan Release tetapi ketika saya mengubah ke Debug (karena saya ingin men-debug beberapa hal, saya bosan melewatkan debugger dalam mode rilis) Saya mendapatkan ini:

    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

Ketika saya membuat Rilis saya juga mendapat peringatan ini:

    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

Saya menemukan bahwa Debugger melompati karena jalur yang salah ke file 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).

Ketika saya pergi ke Debug-> Windows-> Modul saya melihat bahwa dia tidak dapat menemukan file-file pdb atau sesuatu. Bagaimana saya bisa mengatakan kepadanya bahwa file-file itu ada di sini dan di sini? Saya mencoba menjalankan MSvisual sebagai administrator tetapi itu juga tidak membantu. Saya menggunakan server microsoft untuk memuat file pdb tetapi juga tidak membantu.

Qbunia
sumber

Jawaban:

148

Dalam VS2010 iterator tingkat debug standar menjadi 2 dalam debug dan dinonaktifkan dalam rilis. Salah satu dll yang Anda gunakan mungkin memiliki iterator debugging dimatikan dalam debug baik karena dibangun di versi studio visual yang lebih lama atau mereka secara eksplisit menambahkan definisi untuk proyek.

Mencari _ITERATOR_DEBUG_LEVELdan _SECURE_SCLmenghapusnya atau mengaturnya dengan tepat di semua proyek dan sumber dan membangun kembali semuanya.

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

Singkatnya Anda mungkin mencampur rilis dan debug dll. Jangan ditautkan rilis dll dalam debug atau sebaliknya!

AJG85
sumber
6
Saya tidak melihat dalam file .h atau .cpp apa pun dari _ITERATOR_DEBUG_LEVEL atau _SECURE_SCL Mereka hanya ada dalam file obj sebagai: / FAILIFMISMATCH: "_ ITERATOR_DEBUG_LEVEL = 0" Bagaimana
Qbunia
Bagaimana dengan melewatkan breakpoint oleh debugger dalam rilis? Beberapa breakpoint tidak terisi dan mengatakan debugger menghindarinya karena optimisasi atau menautkan sesuatu seperti ini
Qbunia
42
"Singkatnya, Anda mungkin mencampur rilis dan debug dll." Membantu saya. Terima kasih!
Maks.
2
Tunggu dulu! Anda bermaksud memberi tahu saya bahwa ketika saya menggunakan MSVC, untuk mendapatkan build Debug saya harus mengkompilasi ulang SEMUA dependensi? Bahkan mereka yang saya tidak peduli untuk men-debug? Apa yang dia lakukan! Saya tidak percaya ini!
Michael
1
"Singkatnya Anda mungkin mencampur rilis dan debug dlls" -> Dalam kasus saya RuntimeLibrary adalah MultiThreadedDebugDLL dalam rilis Rilis ketika seharusnya MultiThreadedDLL.
Kapten Normal
108

Saya membuat sedikit pembaruan tentang masalah ini, karena saya baru saja mengalami kesalahan yang sama hari ini pada aplikasi yang terhubung dengan lib statis, setelah saya memigrasi proyek Visual 6 lama ke Visual Studio 2012.

Dalam kasus saya kesalahannya adalah bahwa saya keliru mengkompilasi versi Rilis dari lib statis dengan / MDd bukan / MD , sedangkan aplikasi adalah / MD dalam rilis. Pengaturan yang benar / MD dalam proyek lib statis menyelesaikan masalah.

Ini dilakukan di properti Proyek

  • Pilih Properti Konfigurasi / C ++. / Generasi Kode di pohon
  • dan opsi Runtime Library disetel sama pada semua proyek dan aplikasi dependensi Anda.
Francis Pierot
sumber
21

Jika Anda ingin secara sengaja menautkan proyek Anda A in Release dengan proyek B lainnya di Debug, katakanlah untuk menjaga manfaat kinerja keseluruhan aplikasi Anda saat debugging, maka Anda kemungkinan akan menemukan kesalahan ini. Anda dapat memperbaikinya dengan memodifikasi sementara flag preprocessor proyek B untuk menonaktifkan debug iterator (dan membuatnya cocok dengan proyek A):

Dalam properti "Debug" Proyek B, Properti Konfigurasi -> C / C ++ -> Preprocessor, tambahkan berikut ini ke Definisi Preprocessor:

_HAS_ITERATOR_DEBUGGING = 0; _ITERATOR_DEBUG_LEVEL = 0;

Bangun kembali proyek B di Debug, lalu bangun proyek A dalam Rilis dan harus terhubung dengan benar.

Antonio Maiorano
sumber
11

Saya memiliki ketidakcocokan antara proyek: satu dengan set karakter multi-byte, yang lainnya dengan Unicode. Memperbaiki ini untuk menyetujui Unicode memperbaiki masalah.

bebatuan
sumber
2
Ternyata proyek yang saya coba bangun memiliki masalah ini dan juga preprocessor hilang yang tidak terduga dalam debug: _DEBUG. Lihat forums.codeguru.com/...
JGeerWM
Saya punya masalah yang sama mexing di Matlab, tetapi sebaliknya: Saya perlu mengubah VS2013 build menjadi multi-byte untuk mendapatkan kesepakatan. Ini juga menyelesaikan ketidakcocokan untuk RuntimeLIbrary.
barnhillec
10

Kesalahan dapat disebabkan oleh pencampuran bersama build debug dan rilis build di executable atau dll yang sama.

  1. di manajer konfigurasi vs, apakah beberapa proyek Anda dalam mode debug dan beberapa dalam mode rilis?
  2. apakah salah satu proyek rilis Anda memiliki simbol preprocessor yang didefinisikan DEBUG atau _DEBUG?
  3. apakah salah satu proyek debug Anda memiliki simbol preprocessor yang didefinisikan NDEBUG?
Aviad Rozenhek
sumber
7

Saya punya masalah ini juga.

Masalah saya adalah bahwa saya telah menyalin / menempel perpustakaan termasuk direktori dari konfigurasi debug saya.

Jadi proyek "Indep" termasuk pustaka statis "Dep.lib" dari "../Debug", bahkan dalam rilis. Cara mengatasinya adalah mengubah direktori pustaka menjadi "../Release" jadi saya menangkap pustaka yang dibuat rilis daripada pustaka debug yang sebelumnya dibuat.

ArtHare
sumber
Punya masalah yang sama, di mana lib statis saya mendarat di tempat yang sama terlepas apakah rilis atau debug. Dalam hal ini orang harus memberi nama secara berbeda dengan menambahkan 'd' atau semacamnya. Kalau tidak, Anda juga akan dipaksa untuk membangun kembali lib setiap kali Anda beralih di antara debug / rilis.
yau
4

Saya memiliki masalah yang sama antara debug dan rilis perpustakaan. Kesalahan ada di properti solusi / Konfigurasi properti / Konfigurasi.

Konfigurasi proyek tidak sesuai dengan konfigurasi / platform utama.

Alstrice
sumber
3

Coba ubah _DEBUG ke NDEBUG definisi makro dalam properti proyek C ++ (untuk konfigurasi Release) Properti Konfigurasi -> C / C ++ -> Preprocessor -> Definisi Preprocessor

AlexT
sumber
3

Peluang terakhir (jika cara lain tidak berhasil): tentukan _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH makro di semua proyek. Ini akan menonaktifkan fitur "#pragma detect_mismatch" yang digunakan dalam header CRT.

Andrey
sumber
Saya mencoba hampir semua yang ada di halaman ini, dan ini adalah satu-satunya hal yang berhasil. Tambahkan di _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCHbawah C/C++ >> Preprocessor >> PreprocessorDefinitions.
Contango
2

opencv_core245.lib (dxt.obj): error LNK2038: ketidakcocokan terdeteksi untuk '_ITERATOR_DEBUG_LEVEL': nilai '0' tidak cocok dengan nilai '2' dalam test.obj saya mendapat kesalahan seperti ini.
Saya memiliki opencv_core245.lib dan opencv_core245d.lib di Linker-> Input-> Tambahan dependenc. Karena ini dua confilicting saya menghapus opencv_core245.lib pertama. Kesalahan hilang.

Vinit M
sumber
2

Coba ini: Properti proyek Goto -> C / C ++ -> Pembuatan kode -> Runtime Library Pilih dari nilai combobox: DLL multi-ulir (/ MD) Ini bekerja untuk saya :)

Phạm Mạnh
sumber
2

Dalam kasus saya, untuk Debug dan Release, solusinya adalah membersihkan lalu membangun kembali seluruh solusi.

Sunting: true dalam kasus saya juga (VS2017) langkah1: bersihkan proyek. step2: ubah mode konfigurasi (dari debug ke rilis atau sebaliknya). langkah 3: bersihkan proyek. step4: membangun dalam mode konfigurasi yang diperlukan.

PS: untuk mengubah mode konfigurasi, temukan pengaturan konfigurasi di bawah menu bangun

Ionut V.
sumber
1

Saya memiliki masalah yang sama hari ini (VS2010), saya membangun Release | Win32, kemudian mencoba membangun Debug | Win32, dan mendapat pesan ini.

Saya mencoba membersihkan Debug | Win32 tetapi kesalahan masih berlanjut. Saya kemudian membersihkan Release | Win32, lalu bersihkan Debug | Win32, dan kemudian dibangun dengan baik.

GilesDMiddleton
sumber
1

Saya berhasil menyingkirkan kesalahan ini (dalam kasus saya menggunakan Ogre3D + Bullet) dengan mengubah pustaka dependensi ke versi debug di Properti Proyek -> Linker -> Input -> Tambahan Ketergantungan (VC10).

Saya mengubah BulletCollision.lib menjadi BulletCollision_debug.lib (untuk konfigurasi debug) dan dikompilasi.

JTatie
sumber
1

Saya menyelesaikan masalah saya dalam memperbaiki "Direktori Perpustakaan Tambahan", yang ini salah dalam menunjukkan "$ (SolutionDir) \ Release", saya mengubahnya dalam "$ (SolutionDir) \ $ (IntDir)"

Untuk memperbaikinya, buka properti proyek Anda -> Configuration Properties -> Linker -> General -> Direktori Perpustakaan Tambahan

Saya harap ini akan membantu beberapa orang dengan masalah yang sama;)

ThierryV
sumber
jadi bagi saya Debug berfungsi dengan baik tetapi ketika membangun dalam rilis saya mendapatkan kesalahan di atas .... Saya membuka Direktori Perpustakaan Tambahan yang saya temukan: C: / Program Files / PCL 1.8.1 / lib / $ (Konfigurasi) apa yang harus saya tambahkan sekarang sini?
sqp_125
0

Saya juga memiliki masalah ini dan muncul karena saya membuat kembali proyek dan kemudian lupa untuk menautkannya kembali dengan referensi dalam proyek dependen.

Jadi itu menghubungkan dengan referensi ke proyek lama dan bukan yang baru.

Penting untuk diketahui bahwa ada bug dalam menambahkan kembali proyek yang ditautkan sebelumnya dengan referensi. Anda harus menghapus referensi secara manual di vcxproj dan hanya dengan itu Anda dapat menambahkannya kembali. Ini adalah masalah yang diketahui di Visual studio menurut msdn.

AtomicBoolean
sumber
0

Saya memiliki masalah yang sama, tetapi pengaturan yang salah ada di file .lib extern dari mana saya tidak memiliki sumber. Jika Anda tidak memiliki file sumber , solusi paling sederhana adalah dengan hanya mengubah konten file .lib.

Buka file .lib dalam editor (saya menggunakan PSPad, bud notepad Windows juga dimungkinkan) dan ganti semua kejadian _ITERATOR_DEBUG_LEVEL = 2 menjadi _ITERATOR_DEBUG_LEVEL = 0

serbet
sumber
0

Dalam kasus saya definisi makro NDEBUG dalam "Definisi Preprosesor" perlu diubah menjadi _DEBUG. Saya sedang membangun perpustakaan statis untuk digunakan dalam .exe yang mengeluhkan kesalahan yang sama yang tercantum dalam pertanyaan. Pergi ke Configuration Properties (menu "Project", item menu "Properties") dan kemudian klik bagian C / C ++, lalu bagian Preprocessor di bawahnya, lalu edit Definisi Preprocessor Anda sehingga NDEBUG diubah menjadi _DEBUG (untuk mencocokkan pengaturan di exe).

Alyoshak
sumber
0

Seperti semua jawaban lainnya, saya memeriksa Configuration Properties -> C/C++ -> Preprocessorarahan saya .
Dalam kasus saya saya punya NDEBUGbenar didefinisikan dalam Pers, tapi saya juga punya: _SECURE_SCL=1.

Menghapus yang satu itu memperbaiki masalahnya.

Kurang ajar
sumber
-1

Tambahan kecil untuk bantuan di atas: Saya mendapatkan kesalahan ketidakcocokan setelah menambahkan libto statis solusi VST yang lebih lama menggunakan VST 2017. VST sekarang menghasilkan "stdfax.h" untuk header yang sudah dikompilasi yang mengandung 2 baris ini:

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