1

我昨天刚刚从 2005 升级到 Visual Studio 2008。好吧,我正在尝试利用一些新类(特别是 CFrameWndEx),但我遇到了错误。声明一个 CFrameWndEx 子类,然后将 afxcmdiframewndex.h 添加到 stdafx.h 只会给我一个错误。一个看似无害的。我刚刚收到“COleDropTarget 基类未定义”的错误。好的,简单的修复,将 afxole.h 添加到我的包含中,一切都会好的。但在我这样做之后,所有的地狱都会崩溃。在链接之前,输出中的所有内容都很好:

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 代码冲突,但它可能是我的代码。任何帮助将非常感激。

提前致谢。

4

1 回答 1

0

您的问题是 msvcrtd.lib 与 LIBCMT.lib 冲突。不应同时使用它们。编译多线程动态链接调试运行时 (/MDd) 时使用 msvcrtd.lib 库,而编译多线程静态链接非调试运行时 (/MT) 时使用 LIBCMT。有关一些背景信息,请参见此处

如果未指定开关,则默认使用 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 并弄清楚为什么 COleDropTarget 基类未定义,尽管 afxframewndex.h 被包含在内。

于 2011-07-28T20:26:16.843 回答