備注:我上次遇到這個問題是Win32 DLL項目中無意中include了afxwin.h,這個是MFC的頭文件,把這個include刪掉就解決了
================
轉自:http://ticktick.blog.51cto.com/823160/571350
本文主要分析和解決編譯鏈接時產生的 LNK2005 錯誤。
【錯誤信息】:
mfcs90ud.lib(dllmodul.obj) : error LNK2005: _DllMain@12 already defined in MSVCRTD.lib(dllmain.obj)
【分析原因】:
這篇文章:《在Visual C++中以錯誤的順序鏈接CRT庫和MFC庫時出現LNK2005錯誤》詳細分析和說明了產生這種錯誤的原因。
簡單地說,就是產生錯誤的工程同時使用了CRT庫和MFC庫,並且鏈接順序不對,CRT 庫對 new、delete 和 DllMain 函數使用弱外部鏈接。MFC 庫也包含 new、delete 和 DllMain 函數。這些函數要求先鏈接 MFC 庫,然后再鏈接 CRT 庫。
【解決方法】:
在“項目 -> 屬性 -> 鏈接器 -> 命令行”欄中,輸入 /verbose:lib編譯參數,這樣,就可以在output窗口看到鏈接時搜索的庫的先后順序,對於本問題,你一定可以看到類似下面的先后輸出:
> Searching D:\vs2008\VC\lib\MSVCRTD.lib:
> Searching D:\vs2008\VC\atlmfc\lib\mfcs90ud.lib:
由此可以看出,默認情況下,先鏈接了CRT庫MSVCRTD.lib,然后鏈接的是MFC的庫mfcs90ud.lib,因此,需要強制改變一下它們的鏈接順序。
選擇“項目 -> 屬性 -> 鏈接器 -> 輸入”欄,在其中的“忽略特定的庫”這一欄輸入:MSVCRTD.lib mfcs90ud.lib, 然后,在“附加庫”這一欄中輸入: mfcs90ud.lib MSVCRTD.lib 問題即可解決。