多个LNK2005错误

时间:2013-11-07 19:33:49

标签: c visual-studio-2008

我正在编译项目并出现以下错误:

  LIBCMTD.lib(_file.obj) : error LNK2005: ___iob_func already defined in      MSVCRTD.lib(MSVCR90D.dll)
  LIBCMTD.lib(dbgheap.obj) : error LNK2005: __CrtSetCheckCount already defined in MSVCRTD.lib(MSVCR90D.dll)
  LIBCMTD.lib(crt0dat.obj) : error LNK2005: _exit already defined in MSVCRTD.lib(MSVCR90D.dll)
  LIBCMTD.lib(crt0dat.obj) : error LNK2005: __exit already defined in MSVCRTD.lib(MSVCR90D.dll)
  LIBCMTD.lib(crt0dat.obj) : error LNK2005: __cexit already defined in MSVCRTD.lib(MSVCR90D.dll)
  LIBCMTD.lib(crt0dat.obj) : error LNK2005: __amsg_exit already defined in MSVCRTD.lib(MSVCR90D.dll) 
  LIBCMTD.lib(crt0dat.obj) : error LNK2005: __initterm_e already defined in MSVCRTD.lib(MSVCR90D.dll)
  LIBCMTD.lib(fflush.obj) : error LNK2005: _fflush already defined in MSVCRTD.lib(MSVCR90D.dll)
  LIBCMTD.lib(dbghook.obj) : error LNK2005: __crt_debugger_hook already defined in MSVCRTD.lib(MSVCR90D.dll)
  LIBCMTD.lib(invarg.obj) : error LNK2005: __invoke_watson already defined in MSVCRTD.lib(MSVCR90D.dll)
  LIBCMTD.lib(setlocal.obj) : error LNK2005: __configthreadlocale already defined in MSVCRTD.lib(MSVCR90D.dll)
  LIBCMTD.lib(tidtable.obj) : error LNK2005: __encode_pointer already defined in MSVCRTD.lib(MSVCR90D.dll)
  LIBCMTD.lib(tidtable.obj) : error LNK2005: __decode_pointer already defined in MSVCRTD.lib(MSVCR90D.dll)
  LIBCMTD.lib(sprintf.obj) : error LNK2005: _sprintf already defined in MSVCRTD.lib(MSVCR90D.dll)
  LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xi_a already defined in MSVCRTD.lib(cinitexe.obj)
  LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xi_z already defined in MSVCRTD.lib(cinitexe.obj)
  LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xc_a already defined in MSVCRTD.lib(cinitexe.obj)
  LIBCMTD.lib(crt0init.obj) : error LNK2005: ___xc_z already defined in MSVCRTD.lib(cinitexe.obj)

当我删除两个库时,这些错误停止出现,但我有一些未解决的内部符号错误。所以我必须维护这些库。 有没有办法可以忽略已经定义的函数,所以我没有LNK2005错误?

2 个答案:

答案 0 :(得分:14)

您正在将项目与两个版本的运行时库链接:LIBCMTD.lib(静态多线程调试)和MSVCRTD.lib(多线程调试DLL)。为什么这两个版本同时存在于您的项目中,如果不了解您的设置,就不可能说出来。

如果您将第三方库添加到需要不同版本的运行时库的项目中,可能会发生这种情况。

这通常可以通过使用

来解决

Project Properties -> Linker -> Input -> Ignore Specific Default Libraries

在项目属性中设置可执行文件。确定要使用哪个库(LIBCMTD.libMSVCRTD.lib)并要求链接器忽略另一个库。

答案 1 :(得分:2)

除了@Ant所说的,

此MSDN页面显示如何设置“忽略特定默认库”列表: https://msdn.microsoft.com/en-us/library/aa267384(v=vs.60).aspx

在属性 - >链接器 - >输入 - >忽略特定默认库