時 CRT 程式庫和 MFC 程式庫連結順序錯誤 Visual C++ 中,就會發生 LNK2005 錯誤

文章翻譯 文章翻譯
文章編號: 148652 - 檢視此文章適用的產品。
全部展開 | 全部摺疊

在此頁中

徵狀

C 執行階段 (CRT) 程式庫和 Microsoft 基礎類別 (MFC) 程式庫連結順序錯誤時, 可能會收到下列 LNK2005 錯誤:
nafxcwd.lib(afxmem.obj): 錯誤 LNK2005:
"void * __cdecl 運算子 new (且不帶正負號的 int)"= 開頭 (。2@YAPAXI@Z) 已經
在 LIBCMTD.lib(new.obj) 中定義
nafxcwd.lib(afxmem.obj): 錯誤 LNK2005:
"失效 __cdecl 運算子 delete(void *)"= 開頭 (。3@YAXPAX@Z) 已定義
在 [LIBCMTD.lib(dbgnew.obj)
nafxcwd.lib(afxmem.obj): 錯誤 LNK2005:
"void * __cdecl 運算子 new(unsigned int,int,char const *,int)"
(??LIBCMTD.lib(dbgnew.obj) 中已經定義 2@YAPAXIHPBDH@Z)
mfcs40d.lib(dllmodul.obj): 錯誤 LNK2005: _DllMain@12 中已定義
MSVCRTD.LIB (dllmain.obj)
mfcs42d.lib(dllmodul.obj): 錯誤 LNK2005: _DllMain@12 中已定義
msvcrtd.lib(dllmain.obj)

發生的原因

CRT 程式庫使用弱式外部連結 刪除,和 DllMain 函式。MFC 程式庫也包含 、 以 刪除,和 DllMain 函式。這些函式需要 CRT 程式庫連結之前連結 MFC 程式庫。

解決方案

有兩種方法,如果要解決這個問題。第一個解決方案涉及強制連結中正確的順序庫連結器。第二個解決方案可讓您找到造成問題的模組,並加以修正。

附註下列步驟是以 Visual C++ 6.0 為基礎。

一個方案: 強制連結器若要連結程式庫中以正確的順序

  1. 專案] 功能表,按一下 [設定]。
  2. 設定 檢視中 [專案設定] 對話方塊中,按一下以選取 [取得連結錯誤的專案組態。
  3. 在 [連結] 索引標籤按一下以選取 [類別] 下拉式方塊中的 輸入
  4. 忽略程式庫] 方塊中插入程式庫名稱 (比方說 Nafxcwd.lib;Libcmtd.lib)。

    附註連結器命令列中 /NOD 相當: < 程式庫名稱 >.
  5. 物件/程式庫模組] 方塊中插入媒體櫃名稱。您必須確定這些會列在順序,並為行 (比方說 Nafxcwd.lib Libcmtd.lib) 中前兩個程式庫。
若要設定這個選項在 Visual C++.NET,參閱 」 設定 Visual C++ 專案屬性 」 線上說明主題。

兩個解決方案: 找出並更正問題模組

若要欲目前的文件庫的連結順序,請依照下列步驟執行:
  1. 專案] 功能表,按一下 [設定]。
  2. 設定 檢視中 [專案設定] 對話方塊中,按一下以選取 [取得連結錯誤的專案組態。
  3. 在 [連結] 索引標籤上鍵入 / 詳細: lib專案選項] 方塊中。
  4. 重建您的專案。程式庫將會列在 [輸出] 視窗中連結的程序期間。

狀況說明

這種行為是經過設計規劃的。

其他相關資訊

當您使用 [MFC 程式庫必須確定之前 CRT 程式庫連結連結。您可以這樣做,即可確定您的專案中的每個檔案包含 Msdev\Mfc\Include\Afx.h 第一個,可以直接 (# include <Afx.h>) 或間接 (# include <Stdafx.h>)。[Afx.h 包括檔案的軍隊的程式庫正確的順序使用 # pragma lib (<libname>」) 的註解指示詞。

如果原始程式檔具有.c 副檔名為或檔案具有副檔名為.cpp 檔案,但並不會使用 MFC,您可以建立並包含小型的標頭檔 (Forcelib.h) 頂端的模組。這個新的標頭可確保 thelibrary 搜尋順序正確無誤。

Visual C++ 不包含這個標頭檔。如果要建立這個檔案,請依照下列步驟執行:
  1. 開啟 Msdev\Mfc\Include\Afx.h。
  2. 選取 #ifndef _AFX_NOFORCE_LIBS 和 # endif 之間行 / /! _AFX_NOFORCE_LIBS。
  3. 將選取的項目複製到 Windows 剪貼簿。
  4. 建立新的文字檔。
  5. 剪貼簿的內容貼到這個新的檔案。
  6. 將檔案儲存為 Msdev\Mfc\Include\Forcelib.h。

在 Visual C++.NET 問題重現的步驟

  1. 啟動 Microsoft Visual Studio.NET。
  2. 在 [檔案] 功能表上指向 [新增],然後按一下 [專案]。
  3. 按一下 [專案類型 下的 [Visual C++ 專案,然後按一下 [範本] 下方的 [MFC 應用程式
  4. 在 [名稱] 文字方塊中,輸入 Q148652
  5. 在 [位置] 文字方塊中輸入 c:\test,],然後再按一下 [確定]]。
  6. MFC 應用程式精靈] 對話方塊中,按一下 應用程式類型
  7. 按一下 [應用程式類型,] 下的 [對話方塊架構,然後按一下 [MFC] 下的 [使用 MFC 靜態程式庫
  8. 按一下 [完成]。
  9. 在 [方案總管] 中在 [原始程式檔] 下選取 [所有三個.cpp 檔案]。
  10. 三個選取的檔案上按一下滑鼠右鍵,然後按一下 [移除]。
  11. 來源檔案 上按一下滑鼠右鍵,指向 [新增],然後再按一下 [加入新項目
  12. 在 [範本] 下,請按一下 [C + + 檔案]。在 [名稱] 文字方塊中,輸入 Aa。按一下 [開啟舊檔]。
  13. 下列程式碼貼 Aa.cpp 檔案中:
    int test(){new int; return 1;}
  14. 原始程式檔 上按一下滑鼠右鍵,指向 [新增],然後再按一下 [加入現有項目
  15. 選取下列檔案:
    • Q148652.cpp
    • Q148652Dlg.cpp
    • stdafx.cpp
  16. 按一下 [開啟舊檔]。
  17. 您在步驟 15 中選取的檔案會顯示在 [原始程式檔
  18. 選取下的所有四個.cpp 檔案 來源檔案
  19. 您所選取的四個.cpp 檔案上按一下滑鼠右鍵,然後按一下 [內容]。
  20. 展開 [組態屬性,並接著展開 [C/C + +
  21. 按一下 [先行編譯標頭檔]。
  22. 設定 建立/使用先行編譯標頭檔 屬性設定為 未使用標頭先行編譯檔。按一下 [確定]
  23. 在 [建置] 功能表上按一下 重建方案

屬性

文章編號: 148652 - 上次校閱: 2008年3月13日 - 版次: 7.1
這篇文章中的資訊適用於:
  • Microsoft Visual C++ 2008 Express Edition
  • Microsoft Visual C++ 4.0 Standard Edition
  • Microsoft Visual C++ 4.1 Subscription
  • Microsoft Visual C++ 5.0 Enterprise Edition
  • Microsoft Visual C++ 6.0 Enterprise Edition
  • Microsoft Visual C++ 5.0 Professional Edition
  • Microsoft Visual C++ 6.0 Professional Edition
  • Microsoft Visual C++, 32-bit Learning Edition 6.0
  • Microsoft Visual C++ .NET 2002 Standard Edition
  • Microsoft Visual C++ .NET 2003 Standard Edition
關鍵字:?
kbmt kbsweptvs2008 kbtshoot kbarttypeinf kberrmsg kbprb KB148652 KbMtzh
機器翻譯
重要:本文是以 Microsoft 機器翻譯軟體翻譯而成,而非使用人工翻譯而成。Microsoft 同時提供使用者人工翻譯及機器翻譯兩個版本的文章,讓使用者可以依其使用語言使用知識庫中的所有文章。但是,機器翻譯的文章可能不盡完美。這些文章中也可能出現拼字、語意或文法上的錯誤,就像外國人在使用本國語言時可能發生的錯誤。Microsoft 不為內容的翻譯錯誤或客戶對該內容的使用所產生的任何錯誤或損害負責。Microsoft也同時將不斷地就機器翻譯軟體進行更新。
按一下這裡查看此文章的英文版本:148652
Microsoft及(或)其供應商不就任何在本伺服器上發表的文字資料及其相關圖表資訊的恰當性作任何承諾。所有文字資料及其相關圖表均以「現狀」供應,不負任何擔保責任。Microsoft及(或)其供應商謹此聲明,不負任何對與此資訊有關之擔保責任,包括關於適售性、適用於某一特定用途、權利或不侵權的明示或默示擔保責任。Microsoft及(或)其供應商無論如何不對因或與使用本伺服器上資訊或與資訊的實行有關而引起的契約、過失或其他侵權行為之訴訟中的特別的、間接的、衍生性的損害或任何因使用而喪失所導致的之損害、資料或利潤負任何責任。

提供意見

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com