【问题标题】:Error lnk2005 already defined in .obj.obj 中已定义错误 lnk2005
【发布时间】:2015-08-10 16:29:55
【问题描述】:

关于这个错误有很多问题。但它们只与一个变量相关。

test.h

namespace World
{
    enum Objects
    {
        TERRAIN = 1,
        BOX = 2,
        SPHERE = 4,
        CAPSULE = 8

    };  

    void WorldObjects2(unsigned int mask)
    {
      .......
    }
}

void test();

test.cpp

#include "test.h"

void test()
{
    .......
}

ma​​in.cpp

#include "test.h"
int main()
{
    test();
    return 0;
}

当我在 visual stduio 2013 上运行这些代码时,它会引发错误。它说error LNK2005: "void __cdecl World::WorldObjects2(unsigned int)" (?WorldObjects2@World@@YAXI@Z) already defined in main.obj。我该如何纠正这个错误?

【问题讨论】:

标签: c++ visual-studio compiler-errors namespaces function-definition


【解决方案1】:

你的项目有两个函数定义WorldObjects2:一个在编译单元test.cpp,另一个在编译单元main.cpp,因为定义函数的头文件包含在这两个cpp文件中。

要么使用函数说明符inline

inline void WorldObjects2(unsigned int mask)
{
    .......
}

或者将函数定义移动到某个 cpp 文件中,在头文件中只留下一个函数声明(没有它的定义)。

另一种方法是使函数具有内部链接。例如,您可以添加关键字 static

static void WorldObjects2(unsigned int mask)
{
    .......
}

或者可以将函数放置在给定命名空间内的未命名命名空间中。

namespace World
{
    // ...
    namespace
    {
        void WorldObjects2(unsigned int mask)
        {
            .......
        }
    }  
}

【讨论】:

  • 你知道为什么包含保护不适用于这种情况吗?
  • @Timo 它有效。只是有两个单独的编译单元,每个编译单元都包含头文件。
  • 阅读该主题后,static 似乎也是一个选项。在这里找到了解释:forums.codeguru.com/…
  • @Timo 这取决于你是否希望这个函数是静态的。:)
  • 您绝对是对的,但我觉得提及这个附加选项是件好事。将函数设为静态也可以修复此示例,但在另一个项目中可能不是正确的解决方案。
猜你喜欢
  • 1970-01-01
  • 2012-04-25
  • 1970-01-01
  • 2010-10-11
  • 2014-12-21
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
相关资源
最近更新 更多