win .net 問題匯總
今天遇到了一個(gè)問題,在網(wǎng)上尋找解決方案,找了許久沒找到。結(jié)果msdn上立馬找到。 而且作者的分析令人嘆為觀止。做技術(shù)做到見微知著、所有問題都迎刃而解的地步,是在是個(gè)令人向往的境界。?
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運(yùn)行時(shí)庫(kù),上面的意思是在mfc程序中使用到crt函數(shù)時(shí),應(yīng)該讓mfc先于crt鏈接。 這個(gè)一般情況下IDE能幫忙解決,可是有時(shí)程序配置不當(dāng),確實(shí)會(huì)出現(xiàn)這個(gè)問題。 解決方法很簡(jiǎn)單,包含afx.h即可。(當(dāng)然問題是有針對(duì)性的)
solution
2:
Locate and Correct the Problem Module
問題的發(fā)生是因?yàn)閏rt提供了new
delete dllmain 的弱鏈接,而mfc中也有它們的定義,避免使用它們既可。當(dāng)然這不是好辦法。 所以應(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)核對(duì)象命名沖突 : ? ?在處理進(jìn)程和線程的同步問題時(shí), 對(duì)于同步函數(shù)CreateX(mutex, semaphare, event, timer等),如果是非第一次(即,已經(jīng)使用過CreateX )使用且生成同名的object, 則判斷其類型是否相同,如果類型相同,則相當(dāng)于OpenX函數(shù),但是會(huì)生成錯(cuò)誤碼??ERROR_ALREADY_EXISTS; 否則,函數(shù)失敗,?錯(cuò)誤碼?ERROR_INVALID_HANDLE。
。 如,對(duì)于名字為mm的mutex, 第二次調(diào)用createmutex ,相當(dāng)于openmutex;? 但是如果調(diào)用createevent生成名字為mm的事件, 則函數(shù)失敗-- ?因?yàn)樗械膬?nèi)核對(duì)象共享同一個(gè)命名空間。
翻譯自msdn --- ? 應(yīng)該知道, 所有能夠在注冊(cè)表中定位到某一項(xiàng)的函數(shù)都是不安全的,因?yàn)樗鼈兌加锌赡苄薷淖?cè)表。而 如RegQueryValueEx 函數(shù),沒有對(duì)NULL-TERMINATED字符的判斷(也是不安全的), 所有這些需要調(diào)用者充分考慮到; ? ? CRegKey封裝了讀寫(本機(jī))注冊(cè)表的函數(shù),唯有關(guān)閉注冊(cè)表(?CRegKey::Close )?時(shí), 寫入的內(nèi)容才會(huì)被保存,但是這個(gè)過程可能會(huì)花費(fèi)幾秒鐘。RegFlushKey 函數(shù)可以不用關(guān)閉注冊(cè)表就能把注冊(cè)表的改變內(nèi)容寫入到硬盤,但是應(yīng)該慎用,因?yàn)閷懽?cè)表這個(gè)過程畢竟是很耗時(shí)的。??
??