在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中定义了重复的符号,有时我会得到错误,有时不会。
答案 0 :(得分:1)
通常可以覆盖库符号。还有一些警告;例如,如果库代码在同一源文件中包含多个外部函数,并且您想要覆盖其中一个,则可能必须覆盖所有其他函数。否则,您将获得多个定义错误。但在这种情况下,你会得到它。
但是这样的覆盖可能会抛弃增量链接器,特别是如果它是第一次使用覆盖构建的话。完全重建应该足以纠正错误,直到您添加更多覆盖。如果这是一个问题,只需禁用增量链接。