日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

[转]在Visual C++中以错误的顺序链接 CRT 库和 MFC 库时出现 LNK2005 错误

發布時間:2024/4/11 c/c++ 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转]在Visual C++中以错误的顺序链接 CRT 库和 MFC 库时出现 LNK2005 错误 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

癥狀

C 運行時 (CRT) 庫和 Microsoft 基礎類 (MFC) 庫的鏈接順序有誤時,可能會出現以下 LNK2005 錯誤之一: nafxcwd.lib...

當 C 運行時 (CRT) 庫和 Microsoft 基礎類 (MFC) 庫的鏈接順序有誤時,可能會出現以下 LNK2005 錯誤之一:

nafxcwd.lib(afxmem.obj) :error LNK2005:
"void * __cdecl operator new(unsigned int)"(??2@YAPAXI@Z) already
defined in LIBCMTD.lib(new.obj)

nafxcwd.lib(afxmem.obj) :error LNK2005:
"void __cdecl operator delete(void *)"(??3@YAXPAX@Z) already defined
in LIBCMTD.lib(dbgnew.obj)

nafxcwd.lib(afxmem.obj) :error LNK2005:
"void * __cdecl operator new(unsigned int,int,char const *,int)"
(??2@YAPAXIHPBDH@Z) already defined in LIBCMTD.lib(dbgnew.obj)

mfcs40d.lib(dllmodul.obj):error LNK2005:_DllMain@12 already defined in
MSVCRTD.LIB (dllmain.obj)

mfcs42d.lib(dllmodul.obj):error LNK2005:_DllMain@12 already defined in
msvcrtd.lib(dllmain.obj)

原因

CRT 庫對 newdelete DllMain 函數使用弱外部鏈接。MFC 庫也包含 newdelete DllMain 函數。這些函數要求先鏈接...

CRT 庫對 newdeleteDllMain 函數使用弱外部鏈接。MFC 庫也包含 newdeleteDllMain 函數。這些函數要求先鏈接 MFC 庫,然后再鏈接 CRT 庫。

解決方案

該問題有兩種解決方法。第一種方法是強制鏈接器按照正確的順序鏈接庫。第二種方法是由您親自查找導致問題的模塊并糾正它。注意:下列步驟基于 Visual C++ 6....

該問題有兩種解決方法。第一種方法是強制鏈接器按照正確的順序鏈接庫。第二種方法是由您親自查找導致問題的模塊并糾正它。

注意:下列步驟基于 Visual C++ 6.0 進行。

解決方案一:強制鏈接器按照正確的順序鏈接庫

  • 在“項目”菜單上,單擊“設置”。
  • 在“項目設置”對話框的“以下項目的設置”視圖中,單擊以選中出現鏈接錯誤的項目配置。
  • 在“鏈接”選項卡上,單擊以選中“類別”組合框中的“輸入”。
  • 在“忽略庫”框中,插入庫名(例如,Nafxcwd.lib;Libcmtd.lib)。
    注意:等效的鏈接器命令行是:/NOD:<library name>。
  • 在“對象/庫模塊”框中,插入庫名。必須確保這些庫按順序列出,而且是行中的前兩個庫(例如,Nafxcwd.lib 和 Libcmtd.lib)。
  • 要在 Visual C++ .NET 中設置該選項,請閱讀“設置 Visual C++ 項目屬性”聯機幫助主題。

    解決方案二:找到并糾正出現問題的模塊

    要查看當前的庫鏈接順序,請按照下列步驟操作:

  • 在“項目”菜單上,單擊“設置”。
  • 在“項目設置”對話框的“以下項目的設置”視圖中,單擊以選中出現鏈接錯誤的項目配置。
  • 在“鏈接”選項卡上的“項目選項”框中鍵入 /verbose:lib
  • 重新生成項目。在鏈接過程中,這些庫將在輸出窗口中列出。
  • 狀態

    這種現象是設計導致的。

    這種現象是設計導致的。

    更多信息

    使用 MFC 庫時,務必先鏈接它們,然后再鏈接 CRT 庫。這可以通過確保項目中的每個文件都首先包含 Msdev\Mfc\Include\Afx.h 來完成。直...

    使用 MFC 庫時,務必先鏈接它們,然后再鏈接 CRT 庫。這可以通過確保項目中的每個文件都首先包含 Msdev\Mfc\Include\Afx.h 來完成。直接包含 (#include <Afx.h>) 或間接包含 (#include <Stdafx.h>) 都可以。Afx.h 包含文件會通過使用 #pragma comment (lib,"<libname>") 指令來強制采用庫的正確順序。

    如果源文件的擴展名為 .c,或者該文件的擴展名為 .cpp 但不使用 MFC,則可以創建一個較小的頭文件 (Forcelib.h) 并將其放在模塊的頂端。這個新的頭文件可確保按照正確的順序搜索庫。

    Visual C++ 不包含該頭文件。要創建此文件,請按照下列步驟操作:

  • 打開 Msdev\Mfc\Include\Afx.h。
  • 選定 #ifndef _AFX_NOFORCE_LIBS 和 #endif //!_AFX_NOFORCE_LIBS 之間的行。
  • 將選定部分復制到 Windows 剪貼板。
  • 創建一個新文本文件。
  • 將剪貼板的內容粘貼到這個新文件中。
  • 將該文件另存為 Msdev\Mfc\Include\Forcelib.h。
  • Visual C++ .NET 中重現問題的步驟

  • 啟動 Microsoft Visual Studio .NET。
  • 在“文件”菜單上,指向“新建”,然后單擊“項目”。
  • 單擊“項目類型”下的“Visual C++ 項目”,然后單擊“模板”下的“MFC 應用程序”。
  • 在“名稱”文本框中,鍵入 Q148652
  • 在“位置”文本框中,鍵入 C:\Test,然后單擊“確定”。
  • 在“MFC 應用程序向導”對話框中,單擊“應用程序類型”。
  • 單擊“應用程序類型”下的“基于對話框”,然后單擊“MFC 的使用”下的“在靜態庫中使用 MFC”。
  • 單擊“完成”。
  • 在“解決方案資源管理器”中,選擇“源文件”下的全部三個 .cpp 文件。
  • 右鍵單擊三個選定的文件,然后單擊“刪除”。
  • 右鍵單擊“源文件”,指向“添加”,然后單擊“添加新項”。
  • 單擊“模板”下的“C++ 文件”。在“名稱”文本框中,鍵入 Aa。單擊“打開”。
  • 將以下代碼粘貼到 Aa.cpp 中:
    int test()
    {  
      new int;
      return 1;
    }
  • 右鍵單擊“源文件”,指向“添加”,然后單擊“添加現有項”。
  • 選擇以下文件:
    Q148652.cpp
    Q148652Dlg.cpp
    stdafx.cpp
  • 單擊“打開”。
  • 您在第 15 步中選擇的文件將出現在“源文件”下。
  • 選擇“源文件”下的全部四個 .cpp 文件。
  • 右鍵單擊選定的四個 .cpp 文件,然后單擊“屬性”。
  • 展開“配置屬性”,然后展開“C/C++”。
  • 單擊“預編譯頭”。
  • 將“創建/使用預編譯頭”屬性設置為“不使用預編譯頭”。單擊“確定”。
  • 在“生成”菜單上,單擊“重新生成解決方案”。
  • ?【參考資料 感謝作者】
    ?在 Visual C++ 中以錯誤的順序鏈接 CRT 庫和 MFC 庫時出現 LNK2005 錯誤

    轉載于:https://www.cnblogs.com/ziwuge/archive/2011/12/25/2300884.html

    總結

    以上是生活随笔為你收集整理的[转]在Visual C++中以错误的顺序链接 CRT 库和 MFC 库时出现 LNK2005 错误的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。