c++ - 为什么LNK2005错误消失了?

标签 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 : 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/

相关文章:

c++ - 将现有表附加到另一个表

使用 operator new : What are the methods of detecting and processing allocation errors? 的 C++ 内存分配

C++ 模板和工厂

c++ - 通过 Visual Studio 跟踪更改的文件

c# - 如何根据 VS2012 上另一个数据网格的选定行在数据网格上显示 sql 队列结果

sql - 如何使用 Visual Studio Express 2013 从 sql-server 2008 导入数据到 excel

c++ - C# 中的位图转换为 C++

visual-studio-2012 - Visual Studio : The Android SDK Directory could not be found. 请通过/p:AndroidSdkDirectory 设置

c++ - 为 Visual Studio 2012 (ARPACK) 使用 dllwrap 生成 .dll 文件

c++ - 由于 Linux C++ PowerPC 上的 SIGABRT 导致崩溃