簡體   English   中英

使用Visual Studio 2008鏈接錯誤

[英]Link Errors With Visual Studio 2008

我昨天才從2005年升級到Visual Studio 2008。 好吧,我試圖利用某些新類(特別是CFrameWndEx),但遇到了錯誤。 聲明一個CFrameWndEx子類,然后將afxcmdiframewndex.h添加到stdafx.h中,只會給我一個錯誤。 那個似乎無害。 我只是得到“ COleDropTarget基類未定義”的錯誤。 好,簡單的修復,將afxole.h添加到我的include中,一切都會很好。 但是,在那之后,一切都破滅了。 在鏈接之前,輸出中的所有內容都很好:

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)" (?terminate@@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沖突的庫,但是我該怎么做呢?

有人看過這個問題嗎? 似乎與Microsoft代碼發生沖突,但有可能是我的代碼。 任何幫助將非常感激。

提前致謝。

您的問題是msvcrtd.lib與LIBCMT.lib沖突。 它們不應該同時使用。 msvcrtd.lib庫在編譯時用於多線程動態鏈接調試運行時(/ MDd),而LIBCMT在編譯時用於多線程靜態鏈接非調試運行時(/ MT)。 有關某些背景,請參見此處

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

可能值得檢查“配置屬性”。 C / C ++ | “代碼生成” | “運行時庫”設置,以確認對於Release版本將其設置為/ 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基類。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM