这是我的方案。我有一个包含30个子项目的项目。在其中一个项目中,我使用了CLR(公共语言运行库),因此我使用/ mdd(多线程调试DLL)修改了它的运行时。
单独所有项目都已成功构建。但是当我尝试编译主要的时候 项目我收到以下链接器错误:
LINK : warning LNK4098: defaultlib 'MSVCRTD' conflicts with use of other libs; use /NODEFAULTLIB:library
LIBCMTD.lib(winxfltr.obj) : error LNK2005: __XcptFilter already defined in MSVCRTD.lib(MSVCR80D.dll)
LIBCMTD.lib(invarg.obj) : error LNK2005: __invalid_parameter already defined in MSVCRTD.lib(MSVCR80D.dll)
LIBCMTD.lib(invarg.obj) : error LNK2005: __invoke_watson already defined in MSVCRTD.lib(MSVCR80D.dll)
LIBCMTD.lib(crt0.obj) : error LNK2005: _mainCRTStartup already defined in MSVCRTD.lib(crtexe.obj)
LIBCMTD.lib(fclose.obj) : error LNK2005: _fclose already defined in MSVCRTD.lib(MSVCR80D.dll)
LIBCMTD.lib(printf.obj) : error LNK2005: _printf already defined in MSVCRTD.lib(MSVCR80D.dll)
LIBCMTD.lib(mbstowcs.obj) : error LNK2005: _mbstowcs already defined in MSVCRTD.lib(MSVCR80D.dll)
LIBCMTD.lib(dbgrptw.obj) : error LNK2005: __CrtDbgReportW already defined in MSVCRTD.lib(MSVCR80D.dll)
LIBCMTD.lib(wcstombs.obj) : error LNK2005: _wcstombs already defined in MSVCRTD.lib(MSVCR80D.dll)
LIBCMTD.lib(tzset.obj) : error LNK2005: __tzset already defined in MSVCRTD.lib(MSVCR80D.dll)
LIBCMTD.lib(stricmp.obj) : error LNK2005: __stricmp already defined in MSVCRTD.lib(MSVCR80D.dll)
如何解决这些问题?
答案 0 :(得分:22)
LIBCMTD是静态多线程C运行时库的调试版本。 MSVCR80D是基于DLL的多线程C运行时库的调试版本。你的一些子项目要求一个,另一个要求。这是一个微软的混乱,但你必须处理它。选择一个,比方说,多线程调试DLL,并专门用于项目的调试版本和所有子项目。 Microsoft许可证(我被告知)要求您对已发布的软件使用非调试版本。
有关详细信息,请参阅以下内容:CLICK.
答案 1 :(得分:8)
好像你的一些项目使用静态运行时库。 (你已经为你的一个项目选择了动态) 此组合不受支持。