lỗi LNK2038: không khớp được phát hiện cho '_ITERATOR_DEBUG_LEVEL': giá trị '0' không khớp với giá trị '2' trong main.obj


131

Tôi đã đọc rất nhiều giải pháp cho vấn đề của mình nhưng không có gì giúp được. Tôi đã cố gắng làm sạch, xây dựng lại. Cài đặt lại trực quan 2010 và thay đổi từ chuyên nghiệp đến cuối cùng. Nhưng tôi vẫn không biết tại sao tôi có lỗi này. Dự án của tôi trông như thế này: 1 Giải pháp exe để kiểm tra thư viện tĩnh của tôi. 1 thư viện giải pháp tĩnh. Mã được chuyển đổi thành dll đang sử dụng hàm từ 1 lib được gọi là ClassificationFramework. Tôi đã cung cấp lib này như các tiêu đề và cpp để mã nguồn cơ bản. Trong giải pháp exe, tôi đã liên kết thư viện đã tạo của mình + một số lib khác để chạy nó + ClassificationFramework.dll. Mọi thứ đều hoạt động tốt khi tôi sử dụng Phát hành nhưng khi tôi thay đổi thành Gỡ lỗi (vì tôi muốn gỡ lỗi một số nội dung, tôi cảm thấy mệt mỏi khi bỏ qua trình gỡ lỗi trong chế độ phát hành) Tôi nhận được điều này:

    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

Khi tôi xây dựng trong Bản phát hành, tôi cũng nhận được những cảnh báo sau:

    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

Tôi thấy rằng Debugger bỏ qua vì đường dẫn sai đến các tệp 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).

Khi tôi vào Debug-> Windows-> Mô-đun, tôi thấy rằng anh ta không thể tìm thấy các tệp pdb đó hoặc một cái gì đó. Làm thế nào tôi có thể nói với anh ấy rằng những tập tin đang ở đây và đây? Tôi đã cố chạy MSvisual với tư cách quản trị viên nhưng điều đó cũng không giúp được gì. Tôi đã sử dụng máy chủ microsoft để tải các tệp pdb nhưng cũng không giúp được gì.

Câu trả lời:


148

Trong VS2010 iterator mức gỡ lỗi mặc định là 2 trong gỡ lỗi và bị vô hiệu hóa khi phát hành. Một trong những dll bạn đang sử dụng có thể đã tắt trình gỡ lỗi iterator trong gỡ lỗi vì nó được xây dựng trong một phiên bản cũ của studio hình ảnh hoặc họ đã thêm rõ ràng định nghĩa vào dự án.

Tìm kiếm _ITERATOR_DEBUG_LEVEL_SECURE_SCLloại bỏ chúng hoặc đặt chúng một cách thích hợp trong tất cả các dự án và nguồn và xây dựng lại mọi thứ.

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

Trong ngắn hạn, bạn có thể trộn lẫn phát hành và gỡ lỗi dlls. Đừng liên kết các dll phát hành trong gỡ lỗi hoặc ngược lại!


6
Tôi không nhìn thấy trong bất kỳ .h hoặc cpp tập tin bất kỳ _ITERATOR_DEBUG_LEVEL hoặc _SECURE_SCL Họ chỉ tồn tại trong obj file như: / FAILIFMISMATCH: "_ ITERATOR_DEBUG_LEVEL = 0" gì về
Qbunia

Điều gì về việc bỏ qua các điểm dừng bởi trình gỡ lỗi trong bản phát hành? Một số điểm dừng không được lấp đầy và nói rằng trình gỡ lỗi tránh chúng vì tối ưu hóa hoặc liên kết một cái gì đó như thế này
Qbunia

42
"Nói tóm lại, có lẽ bạn đang trộn phát hành và gỡ lỗi dlls" đã giúp tôi. Cảm ơn!
Tối đa

2
Chờ đợi! Bạn muốn nói với tôi rằng khi tôi sử dụng MSVC, để có bản dựng Debug tôi phải biên dịch lại TẤT CẢ các phụ thuộc? Ngay cả những người tôi không quan tâm để gỡ lỗi? Cái quái gì thế! Tôi không thể tin điều này!
Michael

1
"Nói tóm lại, có lẽ bạn đang trộn các bản phát hành và gỡ lỗi" -> Trong trường hợp của tôi, RuntimeL Library là MultiThreadedDebugDLL trong bản dựng Phát hành khi nó phải là MultiThreadedDLL.
Thuyền trưởng bình thường

108

Tôi thực hiện một cập nhật nhỏ về vấn đề này, vì hôm nay tôi cũng gặp lỗi tương tự trên một ứng dụng liên kết với lib tĩnh, sau khi tôi chuyển dự án Visual 6 cũ sang Visual Studio 2012.

Trong trường hợp của tôi, lỗi là do tôi biên dịch nhầm phiên bản Phát hành của lib tĩnh với / MDd thay vì / MD , trong khi ứng dụng là / MD phát hành. Đặt đúng / MD trong dự án lib tĩnh đã giải quyết được vấn đề.

Điều này được thực hiện trong thuộc tính Project

  • Chọn Thuộc tính cấu hình / C C ++ / Tạo mã trong cây
  • và tùy chọn Runtime Library được đặt giống nhau trên tất cả các dự án và ứng dụng phụ thuộc của bạn.

21

Nếu bạn muốn cố tình liên kết dự án A của bạn trong Bản phát hành với dự án B khác trong Debug, hãy nói để giữ lợi ích hiệu suất tổng thể của ứng dụng của bạn trong khi gỡ lỗi, thì bạn có thể sẽ gặp lỗi này. Bạn có thể khắc phục điều này bằng cách sửa đổi tạm thời các cờ tiền xử lý của dự án B để vô hiệu hóa gỡ lỗi iterator (và làm cho nó khớp với dự án A):

Trong thuộc tính "Gỡ lỗi" của Project B, Thuộc tính cấu hình -> C / C ++ -> Bộ xử lý trước, thêm phần sau vào Định nghĩa tiền xử lý:

_HAS_ITERATOR_DEBUGGING = 0; _ITERATOR_DEBUG_LEVEL = 0;

Xây dựng lại dự án B trong Debug, sau đó xây dựng dự án A trong Bản phát hành và nó sẽ liên kết chính xác.


11

Tôi có một sự không phù hợp giữa các dự án: một dự án có bộ ký tự nhiều byte, dự án còn lại có Unicode. Sửa những điều này để thống nhất về Unicode đã khắc phục vấn đề.


2
Hóa ra dự án mà tôi đang cố gắng xây dựng có vấn đề này cũng như một bộ tiền xử lý bị thiếu bất ngờ trong gỡ lỗi: _DEBUG. Xem forums.codeguru.com/...
JGeerWM

Tôi đã gặp một vấn đề tương tự như mexing trong Matlab, nhưng ngược lại: tôi cần thay đổi bản dựng VS2013 thành nhiều byte để có được thỏa thuận. Điều này cũng giải quyết một sự không phù hợp cho RuntimeLIbrary.
barnhillec

10

Lỗi có thể được gây ra bằng cách trộn lẫn các bản dựng gỡ lỗi và bản dựng phát hành trong cùng một tệp thực thi hoặc dll.

  1. trong trình quản lý cấu hình vs, một số dự án của bạn ở chế độ gỡ lỗi và một số trong chế độ phát hành?
  2. một trong các dự án phát hành của bạn có ký hiệu tiền xử lý DEBUG hoặc _DEBUG được xác định không?
  3. một trong các dự án gỡ lỗi của bạn có ký hiệu tiền xử lý NDEBUG được xác định không?

7

Tôi đã có vấn đề này là tốt.

Vấn đề của tôi là tôi đã sao chép / dán thư viện bao gồm các thư mục từ các cấu hình gỡ lỗi của tôi.

Vì vậy, dự án "Độc lập" đã bao gồm thư viện tĩnh "Dep.lib" từ "../Debug", ngay cả khi phát hành. Cách khắc phục là thay đổi thư mục thư viện thành "../Release" để tôi bắt gặp thư viện được xây dựng phát hành thay vì thư viện gỡ lỗi được xây dựng trước đó.


Có một vấn đề tương tự, khi lib tĩnh của tôi hạ cánh ở cùng một vị trí bất kể phát hành hay gỡ lỗi. Trong trường hợp đó, người ta nên đặt tên cho chúng khác nhau bằng cách nối thêm 'd' hoặc tương tự. Nếu không, bạn cũng sẽ bị buộc phải xây dựng lại lib mỗi khi bạn chuyển đổi giữa gỡ lỗi / phát hành.
yau

4

Tôi đã có cùng một vấn đề giữa thư viện gỡ lỗi và phát hành. Lỗi là ở thuộc tính giải pháp / Thuộc tính cấu hình / Cấu hình.

Các cấu hình dự án không phù hợp với cấu hình / nền tảng chính.


3

Hãy thử thay đổi định nghĩa macro _DEBUG thành NDEBUG trong thuộc tính dự án C ++ (đối với cấu hình phát hành) Thuộc tính cấu hình -> C / C ++ -> Bộ xử lý trước -> Định nghĩa tiền xử lý


3

Cơ hội cuối cùng (nếu các cách khác không hoạt động): xác định _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH trong tất cả các dự án. Nó sẽ vô hiệu hóa tính năng "#pragma Det_mismatch" được sử dụng trong các tiêu đề CRT.


Tôi đã thử khá nhiều thứ trên trang này, và đây là thứ duy nhất hoạt động. Thêm vào _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCHdưới C/C++ >> Preprocessor >> PreprocessorDefinitions.
Contango

2

opencv_core245.lib (dxt.obj): lỗi LNK2038: không khớp được phát hiện cho '_ITERATOR_DEBUG_LEVEL': giá trị '0' không khớp với giá trị '2' trong test.obj Tôi gặp lỗi như thế này.
Tôi có opencv_core245.lib và opencv_core245d.lib trong Trình liên kết-> Đầu vào-> Phụ thuộc bổ sung. Vì hai điều này đã gây nhầm lẫn nên tôi đã xóa một opencv_core245.lib đầu tiên. Lỗi đi rồi.


2

Hãy thử điều này: Thuộc tính dự án Goto -> C / C ++ -> Tạo mã -> Thư viện thời gian chạy Chọn từ giá trị combobox: DLL đa luồng (/ MD) Nó hoạt động với tôi :)


2

Trong trường hợp của tôi, đối với cả Gỡ lỗi và Phát hành, giải pháp là làm sạch sau đó xây dựng lại toàn bộ giải pháp.

Chỉnh sửa: true trong trường hợp của tôi cũng (VS2017) bước1: làm sạch dự án. step2: thay đổi chế độ cấu hình (từ gỡ lỗi sang phát hành hoặc ngược lại). bước 3: làm sạch dự án. step4: xây dựng trong chế độ cấu hình yêu cầu.

PS: để thay đổi chế độ cấu hình, tìm cài đặt cấu hình trong menu xây dựng


1

Tôi đã có cùng một vấn đề ngày hôm nay (VS2010), tôi đã xây dựng Bản phát hành | Win32, sau đó đã cố gắng xây dựng Debug | Win32, và nhận được tin nhắn này.

Tôi đã thử làm sạch Debug | Win32 nhưng lỗi vẫn tồn tại. Sau đó tôi dọn dẹp Phát hành | Win32, sau đó được gỡ lỗi | Win32, và sau đó nó được xây dựng tốt.


1

Tôi đã quản lý để loại bỏ lỗi này (trong trường hợp của tôi bằng cách sử dụng Ogre3D + Bullet) bằng cách thay đổi các thư viện phụ thuộc thành các phiên bản gỡ lỗi trong Thuộc tính dự án -> Trình liên kết -> Đầu vào -> Phụ thuộc bổ sung (VC10).

Tôi đã thay đổi BulletCollision.lib thành BulletCollision_debug.lib (để cấu hình gỡ lỗi) và nó được biên dịch.


1

Tôi đã giải quyết vấn đề của mình trong việc sửa "Thư mục thư viện bổ sung", cái này sai khi chỉ ra "$ (SolutionDir) \ Release", tôi đã thay đổi nó thành "$ (SolutionDir) \ $ (IntDir)"

Để sửa lỗi, hãy mở thuộc tính dự án của bạn -> Thuộc tính cấu hình -> Trình liên kết -> Chung -> Thư mục thư viện bổ sung

Tôi hy vọng điều này sẽ giúp một số người gặp rắc rối tương tự;)


Vì vậy, đối với tôi Debug hoạt động tốt nhưng khi xây dựng bản phát hành tôi gặp lỗi ở trên .... Tôi đã mở Thư mục thư viện bổ sung Tôi tìm thấy: C: / Chương trình tệp / PCL 1.8.1 / lib / $ (Cấu hình) tôi nên thêm gì bây giờ đây?
sqp_125

0

Tôi cũng có vấn đề này và nó phát sinh vì tôi đã thực hiện lại dự án và sau đó quên liên kết lại bằng cách tham chiếu trong một dự án phụ thuộc.

Do đó, nó đã được liên kết bằng cách tham chiếu đến dự án cũ thay vì dự án mới.

Điều quan trọng là phải biết rằng có một lỗi trong việc thêm lại một dự án được liên kết trước đó bằng cách tham chiếu. Bạn phải xóa thủ công tham chiếu trong vcxproj và chỉ sau đó bạn mới có thể thêm lại tài liệu đó. Đây là một vấn đề được biết đến trong Visual studio theo msdn.


0

Tôi gặp vấn đề tương tự, nhưng cài đặt sai nằm trong tệp .lib bên ngoài mà tôi không có nguồn. Nếu bạn không có tập tin nguồn , cách giải quyết đơn giản nhất là chỉ thay đổi nội dung của tệp .lib.

Mở tệp .lib trong trình chỉnh sửa (Tôi đã sử dụng PSPad, cũng có thể sử dụng notepad Windows) và thay thế tất cả các lần xuất hiện của _ITERATOR_DEBUG_LEVEL = 2 thành _ITERATOR_DEBUG_LEVEL = 0


0

Trong trường hợp của tôi, định nghĩa macro NDEBUG trong "Định nghĩa tiền xử lý" cần được thay đổi thành _DEBUG. Tôi đang xây dựng một thư viện tĩnh để sử dụng trong .exe đã phàn nàn về chính lỗi tương tự được liệt kê trong câu hỏi. Chuyển đến Thuộc tính cấu hình (menu "Dự án", mục menu "Thuộc tính") và sau đó nhấp vào phần C / C ++, sau đó là phần Tiền xử lý bên dưới, sau đó chỉnh sửa Định nghĩa tiền xử lý của bạn để NDEBUG được thay đổi thành _DEBUG (để khớp với thiết lập trong exe).


0

Giống như tất cả các câu trả lời khác, tôi đã kiểm tra Configuration Properties -> C/C++ -> Preprocessorchỉ thị của mình .
Trong trường hợp của tôi, tôi đã NDEBUGxác định chính xác trong Bản phát hành, nhưng tôi cũng có : _SECURE_SCL=1.

Loại bỏ cái đó đã khắc phục vấn đề.


-1

Một bổ sung nhỏ cho sự trợ giúp ở trên: Tôi đã gặp lỗi không khớp sau khi thêm lib tĩnh vào giải pháp VST cũ hơn bằng VST 2017. VST hiện tạo "stdfax.h" cho các tiêu đề được biên dịch trước có chứa 2 dòng này:

// Turn off iterator debugging as it makes the compiler very slow on large methods in debug builds
#define _HAS_ITERATOR_DEBUGGING 0
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.