在VC++的設定:
C/C++若有定義_DEBUG 則需注意link應該link MTd or MDd
因為有些function 如_free_dbg是在定義_DEBUG時會被編譯(參考<crtdbg.h>)
此時如果link到release版的MT or MD,則會出現unresolved link
另外,這個錯誤訊息也是因為_DEBUG混用造成的
error LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in ...
在<yvals.h≶(一些c++ std header會間接引用)
#ifdef _DEBUG #define _HAS_ITERATOR_DEBUGGING 1 #else #define _HAS_ITERATOR_DEBUGGING 0 #endif #if _HAS_ITERATOR_DEBUGGING #define _ITERATOR_DEBUG_LEVEL 2 #elif _SECURE_SCL #define _ITERATOR_DEBUG_LEVEL 1 #else #define _ITERATOR_DEBUG_LEVEL 0 #endif #ifdef __cplusplus //這邊檢查LNK2038: mismatch detected for '_ITERATOR_DEBUG_LEVEL': value '0' doesn't match value '2' in ... #ifndef _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH #pragma detect_mismatch("_ITERATOR_DEBUG_LEVEL", _STRINGIZE(_ITERATOR_DEBUG_LEVEL)) #endif /* _ALLOW_ITERATOR_DEBUG_LEVEL_MISMATCH */ //這邊檢查runtime lib:LNK2038 mismatch detected for 'RuntimeLibrary': value 'MT_StaticRelease' doesn't match value 'MTd_StaticDebug' #ifndef _ALLOW_RUNTIME_LIBRARY_MISMATCH //.... #endif /* __cplusplus */
因此在整合各個不同的(static)library時,最簡單的方式是確保所有的編譯runtime選項是一致,對於c interface dll則不用特別關注編譯選項的問題,只要確保allocate resource和release resource和release都是在dll內部處理(例如不應該將dll內部malloc的resource 在dll外部free)