程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> VC++常規錯誤之17:1>nafxcwd.lib(afxmem.obj) : error LNK2005

VC++常規錯誤之17:1>nafxcwd.lib(afxmem.obj) : error LNK2005

編輯:C++入門知識

VC++常規錯誤之17:1>nafxcwd.lib(afxmem.obj) : error LNK2005

(1)錯誤案例:在寫日志程序中出現,工程是MFC程序(注:win32控制台應用程序,不會出現這種錯誤,當然是不支持MFC庫的那種)

(2)錯誤原因:如下能看出一點眉目,重定義了.在使用***.obj時,已經在***.lib庫中定義了.

摘抄:

上網搜了下,是CRT庫與MFC庫的沖突,解決方法是:讓程序先鏈接Nafxcwd.lib,然後再鏈接Libcmtd.lib

you've got to change the order inwhich the libraries are linked. This is a bit tricky, since the library are linked automatically, without you explicitly specifying them.

So, first step, tell the linker to ignore the implicit libraries: Project/Setting/Linker, Input Tab, and put "Nafxcwd.lib Libcmtd.lib" in the "Libraries to Ignore" box.

Next, on the same page, in the Object/library Modules box, put the same to libraries. (in you still get the same error, try reversing them on this line)

可以從錯誤信息裡看到,操作符new,delete,delete[]已經在LIBCMTD.lib中定義了,這跟C編譯時使用的默認庫與MFC運行時的默認編譯庫編譯時鏈接順序有關,我們可以手動的改變兩個庫的編譯順序就能解決這個定義沖突問題。

(3)錯誤現場:

1>正在鏈接...
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) 中定義
1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void * __cdecl operator new[](unsigned int)" () 已經在 libcpmtd.lib(newaop.obj) 中定義
1>nafxcwd.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete[](void *)" () 已經在 LIBCMTD.lib(delete2.obj) 中定義
1>C:\Documents and Settings\Administrator\桌面\多線程寫日志怎樣寫\寫日志1\Debug\寫日志1.exe : fatal error LNK1169: 找到一個或多個多重定義的符號

(4)錯誤解決辦法:

中文

項目--屬性 ---連接器---輸入  

                              附加依賴項    空格Nafxcwd.lib Libcmtd.lib

                              忽略指定庫    空格Nafxcwd.lib Libcmtd.lib

清除項目。重新編譯。搞定

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved