为什么LNK2005错误会消失?

时间:2015-11-17 16:34:32

标签: c++ visual-studio-2012

在visual studio 2012中,我有一个带有以下代码的小型控制台c ++项目

Main.cpp的

#include "../TestLib/LibFunction.h"

int _tmain(int argc, _TCHAR* argv[])
{
    int number = libFunction(7);
    return 0;
}

我在一个静态库项目LibTest中 的 LibFunction.h

#pragma once

int libFunction( int a );

LibFunction.cpp

int libFunction( int a )
{
   return a + 1;
}

这编译并运行正常。 (库被添加为引用并隐式链接)

如果我现在将此代码添加到主项目

int libFunction( int a )
{
   return 7 * a;
}

当我尝试构建程序时,我收到此错误

  

Main.obj:错误LNK2005:已在TestLib.lib(LibFunction.obj)中定义的“int __cdecl libFunction(int)”(?libFunction @@ YAHH @ Z)

这是公平的。但是,如果我现在只是尝试再次构建(不执行任何其他操作),则链接完成且没有错误,并且程序在使用新的libFunction时运行良好。

为什么错误会消失? 为什么会出现这种不一致?要么覆盖库中的函数,要么它不是有效的。我不应该得到一个错误然后没有做任何事情就没有错误。

我正在尝试理解一个更大的项目的行为,其中在exe和引用的lib中定义了重复的符号,有时我会得到错误,有时不会。

1 个答案:

答案 0 :(得分:1)

通常可以覆盖库符号。还有一些警告;例如,如果库代码在同一源文件中包含多个外部函数,并且您想要覆盖其中一个,则可能必须覆盖所有其他函数。否则,您将获得多个定义错误。但在这种情况下,你会得到它。

但是这样的覆盖可能会抛弃增量链接器,特别是如果它是第一次使用覆盖构建的话。完全重建应该足以纠正错误,直到您添加更多覆盖。如果这是一个问题,只需禁用增量链接。