1. 程式人生 > >mfcs100ud.lib(dllmodul.obj) : error LNK2005: [email

mfcs100ud.lib(dllmodul.obj) : error LNK2005: [email

今天用VC2010寫一個用了MFC的規則DLL,編譯時報告如題錯誤。

必應後發現這篇文章  error LNK2005: [email protected] 已經在 MSVCRTD.lib(dllmain.obj) 中定義

  http://wanglimin2004.blog.163.com/blog/static/1154884982012393174875/

為防止連線失效,把內容摘抄如下:


這篇文章:《在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  問題即可解決。


我用的是vc2010, 專案 | 屬性 | 配置屬性 | 連結器 | 輸入,忽略特定預設庫=MSVCRTD.lib;mfcs100ud.lib

附加依賴項=mfcs100ud.lib;MSVCRTD.lib