首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用2008链接错误

用2008链接错误
EN

Stack Overflow用户
提问于 2011-07-28 15:29:27
回答 1查看 4.7K关注 0票数 1

昨天我刚升级到Visual 2008,从2005年开始。嗯,我正在尝试利用一些新的类(特别是CFrameWndEx),而且我也会遇到错误。声明一个CFrameWndEx子类,然后将afxcmdiframewndex.h wndex.h添加到stdafx.h只会给出一个错误。似乎是无害的。我只得到"COleDropTarget基类未定义“的错误。好的,简单的修正,将afxole.h添加到我的包含中,这一切都会很好。但在我做完这件事之后,所有的地狱都散去了。在链接之前,输出中的所有内容都是良好的:

代码语言:javascript
复制
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冲突的库,但是我该如何处理呢?

有人见过这个问题吗?这似乎与微软代码有冲突,但有可能是我的代码。任何帮助都将不胜感激。

提前谢谢。

EN

回答 1

Stack Overflow用户

发布于 2011-07-28 20:26:16

您的问题是msvcrtd.lib与LIBCMT.lib冲突。它们不应该都被使用。msvcrtd.lib库用于多线程动态链接调试运行时(/MDd),而LIBCMT用于多线程静态链接非调试运行时(/MT)。有关背景信息,请参见这里

如果没有指定开关,LIBCMT是默认使用的。

也许值得检查一下"Configuration“(Configuration)(Configuration))(Configuration)(Configuration)、代码生成(Configuration)(代码生成)(Configuration)(代码生成)(Configuration)(Runtime)设置(Runtime)设置为/MD (用于发布版本),将其设置为/MDd (用于调试生成)。您需要检查项目和项目中每个cpp文件的设置,因为单个文件可以有不同的设置。

不过,老实说,如果开关设置是错误的,那么即使在您包含afxole.h之前,我也希望问题会出现,而且我也希望afxver.h生成一个错误,要求您使用/MD开关,所以问题可能比错误的开关设置更微妙。

更新:我取出了对/ML开关的引用,即Visual 2003而不是Visual 2005。

Update:再考虑一下这一点,如果您已经添加了afxframewndex.h,那么就不需要显式地包含afxole.h,因为它应该为您包括在内。

如果打开/showIncludes并编译程序,输出窗口应该显示如下所示.

代码语言:javascript
复制
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

您需要摆脱显式#include of afxole.h,并弄清楚为什么COleDropTarget基类是未定义的,尽管包含了afxframewndex.h wndex.h。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6861556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档