首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> C++ 入門

VS MFC 專案鏈接錯誤 LNK2005 解決:nafxcwd.lib 與 LIBCMTD.lib 衝突

     編輯:C++ 入門

錯誤現象

1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new(unsigned int)" 已經在 LIBCMTD.lib(new.obj) 中定義
1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" 已經在 LIBCMTD.lib(dbgdel.obj) 中定義
... 多重定義符號導致 LNK1169

根因

MFC 靜態庫 (nafxcwd.lib) 與 C 運行時靜態庫 (LIBCMTD.lib) 都定義了 new/delete 運算符,**鏈接順序錯誤**導致重複符號衝突。

解決方案:調整鏈接順序

強制鏈接器**先處理 MFC 庫,再處理 CRT 庫**

VS 2010+ 圖形界面設置

  1. 專案右鍵 → Properties
  2. Linker → Input
  3. Ignore Specific Default Libraries:添加 nafxcwd.lib;libcmtd.lib
  4. Additional Dependencies:添加 nafxcwd.lib libcmtd.lib(順序:MFC 先,CRT 後)
  5. 清理解決方案 → 重新生成

命令行/屬性頁等效 XML

<IgnoreSpecificDefaultLibraries>nafxcwd.lib;libcmtd.lib</IgnoreSpecificDefaultLibraries>
<AdditionalDependencies>nafxcwd.lib;libcmtd.lib;%(AdditionalDependencies)</AdditionalDependencies>

原理補充

  • CRT 庫提供基礎 new/delete 實現
  • MFC 庫為了調試內存洩漏,重載了 new/delete 並記錄文件/行號
  • 若 CRT 先鏈接,其符號被解析;MFC 再鏈接時發現重複定義報錯
  • 先鏈接 MFC,其符號滿足引用,CRT 同名符號被忽略

避坑指南

  1. 新建 MFC 專案用向導,自動配置正確
  2. 手動添加 MFC 支持時必須檢查 Code Generation → Runtime Library 一致性(均為 /MTd 或 /MDd)
  3. 混合靜態/動態運行時會導致更隱蔽的堆損壞
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved