2011-07-28 109 views
1

我剛剛從2005年起從2005年升級到Visual Studio 2008。那麼,我試圖利用一些新的類(特別是CFrameWndEx),我得到的錯誤。聲明一個CFrameWndEx子類,然後將afxcmdiframewndex.h添加到stdafx.h中只會導致一個錯誤。這是一個看似無害的人。我只是得到「COleDropTarget基類未定義」的錯誤。好的,簡單的修復,添加afxole.h到我的包括,它會一切都很好。但是當我這樣做的時候,所有地獄都會崩潰。在輸出一切都很好,直到鏈接:使用Visual Studio 2008鏈接錯誤

1>LIBCMT.lib(sprintf.obj) : error LNK2005: _sprintf already defined in msvcrtd.lib(MSVCR90D.dll) 
1>LIBCMT.lib(invarg.obj) : error LNK2005: __invoke_watson already defined in msvcrtd.lib(MSVCR90D.dll) 
1>LIBCMT.lib(tidtable.obj) : error LNK2005: __encode_pointer already defined in msvcrtd.lib(MSVCR90D.dll) 
1>LIBCMT.lib(tidtable.obj) : error LNK2005: __decode_pointer already defined in msvcrtd.lib(MSVCR90D.dll) 
1>LIBCMT.lib(setlocal.obj) : error LNK2005: __configthreadlocale already defined in msvcrtd.lib(MSVCR90D.dll) 
1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __amsg_exit already defined in msvcrtd.lib(MSVCR90D.dll) 
1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __initterm_e already defined in msvcrtd.lib(MSVCR90D.dll) 
1>LIBCMT.lib(crt0dat.obj) : error LNK2005: _exit already defined in msvcrtd.lib(MSVCR90D.dll) 
1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __exit already defined in msvcrtd.lib(MSVCR90D.dll) 
1>LIBCMT.lib(crt0dat.obj) : error LNK2005: __cexit already defined in msvcrtd.lib(MSVCR90D.dll) 
1>LIBCMT.lib(mlock.obj) : error LNK2005: __unlock already defined in msvcrtd.lib(MSVCR90D.dll) 
1>LIBCMT.lib(mlock.obj) : error LNK2005: __lock already defined in msvcrtd.lib(MSVCR90D.dll) 
1>LIBCMT.lib(winxfltr.obj) : error LNK2005: __XcptFilter already defined in msvcrtd.lib(MSVCR90D.dll) 
1>LIBCMT.lib(strftime.obj) : error LNK2005: _strftime already defined in msvcrtd.lib(MSVCR90D.dll) 
1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_a already defined in msvcrtd.lib(cinitexe.obj) 
1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xi_z already defined in msvcrtd.lib(cinitexe.obj) 
1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_a already defined in msvcrtd.lib(cinitexe.obj) 
1>LIBCMT.lib(crt0init.obj) : error LNK2005: ___xc_z already defined in msvcrtd.lib(cinitexe.obj) 
1>LIBCMT.lib(hooks.obj) : error LNK2005: "void __cdecl terminate(void)" ([email protected]@YAXXZ) already defined in msvcrtd.lib(MSVCR90D.dll) 
1>LIBCMT.lib(errmode.obj) : error LNK2005: ___set_app_type already defined in msvcrtd.lib(MSVCR90D.dll) 
1>msvcrtd.lib(MSVCR90D.dll) : error LNK2005: __setmbcp already defined in LIBCMT.lib(mbctype.obj) 
1>LINK : warning LNK4098: defaultlib 'msvcrtd.lib' conflicts with use of other libs; use /NODEFAULTLIB:library 
1>LINK : warning LNK4098: defaultlib 'LIBCMT' conflicts with use of other libs; use /NODEFAULTLIB:library 

而且使用/ NODEFAULTLIB擺脫MSVCRTD.LIB和LIBCMT只是造成更多的問題全亂了負荷。我會假設解決這個問題的一種方法是找到與msvcrtd.lib和LIBCMT衝突的庫,但我該怎麼做呢?

有沒有人見過這個問題?這看起來像是與微軟代碼的衝突,但它可能是我的代碼。任何幫助將非常感激。

在此先感謝。

+0

在您的文章中是否有錯別字? CFrameWndEx的頭文件是[afxframewndex.h](http://msdn.microsoft.com/en-us/library/bb983252(v = VS.90).aspx)not afxcmdiframewndex.h –

回答

0

您的問題是msvcrtd.lib與LIBCMT.lib衝突。他們不應該被使用。編譯多線程動態鏈接調試運行時(/ MDd)時使用msvcrtd.lib庫,而在編譯多線程靜態鏈接非調試運行時(/ MT)時使用LIBCMT。有關背景信息,請參閱here

如果未指定開關,則LIBCMT是默認使用。

這可能是值得檢查「配置屬性」| C/C++ | 「代碼生成」| 「運行時庫」設置,以確認它已設置爲發佈版本的/ MD和調試版本的/ MDd。您需要檢查項目的設置以及項目中每個cpp文件的設置,因爲單個文件可以具有不同的設置。老實說,如果開關設置是錯誤的我會期望問題表現出來,甚至在你包含afxole.h之前,我會期望afxver.h產生一個錯誤,要求你使用/ MD開關,所以這個問題可能比只是錯誤的開關設置更微妙。

更新:我拿出參考/ ML開關,這是Visual Studio 2003中沒有Visual Studio 2005中

更新:想到這裏多一些,如果你已經添加afxframewndex.h那麼你不應該明確包含afxole.h,因爲它應該包含給你。

如果打開/showIncludes和編譯程序的輸出窗口應該顯示這樣的事情...

1>Note: including file: c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\atlmfc\include\afxframewndex.h 
[snipped all the includes due to afxframeimpl.h and afxcontrolbarutil.h] 
1>Note: including file: c:\program files (x86)\microsoft visual studio 9.0\vc\atlmfc\include\afxpopupmenu.h 
1>Note: including file: c:\program files (x86)\microsoft visual studio 9.0\vc\atlmfc\include\afxpopupmenubar.h 
1>Note: including file:  c:\program files (x86)\microsoft visual studio 9.0\vc\atlmfc\include\afxtoolbar.h 
1>Note: including file:  c:\program files (x86)\microsoft visual studio 9.0\vc\atlmfc\include\afxtoolbardroptarget.h 
1>Note: including file:  c:\Program Files (x86)\Microsoft Visual Studio 9.0\VC\atlmfc\include\afxole.h 

你需要擺脫你的AFXOLE.H明確的#include和弄清楚爲什麼儘管包含了afxframewndex.h,但COleDropTarget基類仍未定義。