在 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 : error LNK2005: "int __cdecl libFunction(int)" (?libFunction@@YAHH@Z) already defined in TestLib.lib(LibFunction.obj)
这很公平。但是,如果我现在再次尝试构建(什么都不做),链接将无误地完成,并且程序运行正常,并且使用了新的 libFunction。
为什么错误消失了? 为什么会有这种不一致?覆盖库中的函数是否有效。我不应该得到一个错误,然后什么都不做就没有错误。
我正在尝试理解一个更大项目的行为,该项目再次在 exe 和引用的库中定义了重复的符号,有时我会出错,有时不会。
最佳答案
通常覆盖库符号应该没问题。仍然有警告;例如,如果库代码在同一个源文件中包含多个外部函数,并且您想要覆盖其中一个,则可能必须覆盖所有其他函数。否则你会得到多重定义错误。但在这种情况下,您将始终如一地获得它。
但是,此类覆盖可能会影响增量链接器,特别是如果它是第一个使用覆盖的构建。在您添加更多覆盖之前,完全重建应该足以纠正错误。如果这是一个问题,只需禁用增量链接。
关于c++ - 为什么LNK2005错误消失了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33762266/