今天遇到了一個問題,在網(wǎng)上尋找解決方案,找了許久沒找到。結(jié)果msdn上立馬找到。 而且作者的分析令人嘆為觀止。做技術(shù)做到見微知著、所有問題都迎刃而解的地步,是在是個令人向往的境界。?
error ?link 2005 ? ?
Error?24?error?LNK2005:?"void?__cdecl?operator?delete[](void?*)"?(??_V@YAXPAX@Z)?already?defined?in?LIBCMTD.lib(delete2.obj)?uafxcwd.lib Error?22?error?LNK2005:?"void?__cdecl?operator?delete(void?*)"?(??3@YAXPAX@Z)?already?defined?in?LIBCMTD.lib(dbgdel.obj)?uafxcwd.lib Error?23?error?LNK2005:?"void?*?__cdecl?operator?new[](unsigned?int)"?(??_U@YAPAXI@Z)?already?defined?in?libcpmtd.lib(newaop.obj)?uafxcwd.lib Error?21?error?LNK2005:?"void?*?__cdecl?operator?new(unsigned?int)"?(??2@YAPAXI@Z)?already?defined?in?LIBCMTD.lib(new.obj)?uafxcwd.lib
solution ?1 ?: ? ?Force Linker to Link Libraries in Correct Order
When you use the MFC libraries, you must make sure that they are linked before the CRT library is linked. You can do this by making sure that every file in your project includes MsdevMfcIncludeAfx.h first, either directly (#include ) or indirectly (#include ). The Afx.h include file forces the correct order of the libraries, by using the directive:
#pragma
comment (lib,"
CRT
是 C運行時庫,上面的意思是在mfc程序中使用到crt函數(shù)時,應(yīng)該讓mfc先于crt鏈接。 這個一般情況下IDE能幫忙解決,可是有時程序配置不當,確實會出現(xiàn)這個問題。 解決方法很簡單,包含afx.h即可。(當然問題是有針對性的)
solution
2:
Locate and Correct the Problem Module
問題的發(fā)生是因為crt提供了new
delete dllmain 的弱鏈接,而mfc中也有它們的定義,避免使用它們既可。當然這不是好辦法。 所以應(yīng)該在一開始就把程序配置好。
http://social.msdn.microsoft.com/Forums/en-US/ceb90f33-b348-42a7-9e23-a533ba0c7da4/uafxcwdlibdllmodulobj-error-lnk2005-dllmain12-already-defined-in-mytestdllobj
http://stackoverflow.com/questions/3586195/visual-studio-linking-errors-order-in-which-mfc-crt-included
翻譯自msdn --- ? 內(nèi)核對象命名沖突 : ? ?在處理進程和線程的同步問題時, 對于同步函數(shù)CreateX(mutex, semaphare, event, timer等),如果是非第一次(即,已經(jīng)使用過CreateX )使用且生成同名的object, 則判斷其類型是否相同,如果類型相同,則相當于OpenX函數(shù),但是會生成錯誤碼??ERROR_ALREADY_EXISTS; 否則,函數(shù)失敗,?錯誤碼?ERROR_INVALID_HANDLE。
。 如,對于名字為mm的mutex, 第二次調(diào)用createmutex ,相當于openmutex;? 但是如果調(diào)用createevent生成名字為mm的事件, 則函數(shù)失敗-- ?因為所有的內(nèi)核對象共享同一個命名空間。
翻譯自msdn --- ? 應(yīng)該知道, 所有能夠在注冊表中定位到某一項的函數(shù)都是不安全的,因為它們都有可能修改注冊表。而 如RegQueryValueEx 函數(shù),沒有對NULL-TERMINATED字符的判斷(也是不安全的), 所有這些需要調(diào)用者充分考慮到; ? ? CRegKey封裝了讀寫(本機)注冊表的函數(shù),唯有關(guān)閉注冊表(?CRegKey::Close )?時, 寫入的內(nèi)容才會被保存,但是這個過程可能會花費幾秒鐘。RegFlushKey 函數(shù)可以不用關(guān)閉注冊表就能把注冊表的改變內(nèi)容寫入到硬盤,但是應(yīng)該慎用,因為寫注冊表這個過程畢竟是很耗時的。??
??