2011-07-28 108 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基类仍未定义。