什么导致VS2013错误LNK2005:__xi_a已在MSVCRT.lib(cinitexe.obj)中定义?

时间:2014-01-04 08:31:42

标签: c++ visual-studio visual-studio-2013

我的解决方案昨天建成。今天除了 .hpp .cpp 文件之外什么都没改。

Visual Studio 2013中的完整错误文本(使用2013年11月的CTP):

Error   1   error LNK2005: __xi_a already defined in MSVCRT.lib(cinitexe.obj)   C:\Users\drtwox\dev\repos\game\trunk\engine\game\LIBCMT.lib(crt0init.obj)   game
Error   2   error LNK2005: __xi_z already defined in MSVCRT.lib(cinitexe.obj)   C:\Users\drtwox\dev\repos\game\trunk\engine\game\LIBCMT.lib(crt0init.obj)   game
Error   3   error LNK2005: __xc_a already defined in MSVCRT.lib(cinitexe.obj)   C:\Users\drtwox\dev\repos\game\trunk\engine\game\LIBCMT.lib(crt0init.obj)   game
Error   4   error LNK2005: __xc_z already defined in MSVCRT.lib(cinitexe.obj)   C:\Users\drtwox\dev\repos\game\trunk\engine\game\LIBCMT.lib(crt0init.obj)   game
Error   7   error LNK1169: one or more multiply defined symbols found   C:\Users\drtwox\dev\repos\game\trunk\engine\build\x64\Test\game.exe 1   1   game

关于眼睛捅的有用......

This answerthis similar question说:

  

您正在混合使用/ MD编译的代码(使用DLL版本的   CRT)使用/ MT编译的代码(使用静态CRT库)。   这不起作用,所有源代码文件必须使用相同的编译   设置。鉴于您使用的是使用/ MD预编译的库,   几乎总是正确的设置,你必须编译自己的代码   此设置也是如此。

我已检查(并重新检查)解决方案中的所有项目仍在使用相同的运行时库;发布Multi-threaded DLL和调试Multi-threaded Debug DLL。为了确保我完成了完整的解决方案重建。

Subversion日志显示自2013-12-04以来未包含所有第三方库的“外部”目录;一个月前。我检查了他们的配置并重建了它们。

Subversion日志还显示自昨天以来仅修改了现有的 .hpp .cpp 文件。没有添加新库,没有新的外部头文件#included,也没有更改项目配置。在7个文件中有超过200行已更改和新代码。

可能是什么问题?

更新:来自编译器的日志:http://pastebin.com/aHJ5Xi2V

解决方案:问题不正确/ MT / MD编译器标志,它是GLEW库并且缺少#define GLEW_STATIC。我将GLEW项目设置更改为使用/ Zl(忽略默认库名称),如下所示:http://msdn.microsoft.com/en-us/library/f1tbxcxh.aspx

1 个答案:

答案 0 :(得分:3)

导致两个运行时都被链接起来。

首先尝试清理(手动)项目创建并重建的所有.obj和.lib文件。

如果这没有帮助,请在IDE中设置链接器的/VERBOSE标志(“链接器|常规|显示进度”=“显示所有进度消息(/ VERBOSE)”。)

然后看输出;在IDE中,它将位于名为<project-name>.log的文件的构建输出目录中。

您将看到每个库的搜索位置以及导致搜索库的对象文件。


更新

日志输出显示由于正在处理的一个或多个目标文件中的LIBCMT.lib指令(可能是库中的目标文件)而正在搜索DEFAULTLIB

但是,我不清楚输入哪个输入负责的日志输出 - 我认为它是glew32s.lib(其中的glew.obj对象)。

有关查找哪些.obj / .lib文件具有DEFAULTLIB指令的方法,请参见this SO answer

您可能会在项目属性中设置/NODEFAULTLIB:libcmt.lib选项(“忽略特定默认库”)。