错误lnk2005已在.obj中定义

7

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

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()
{
    .......
}

main.cpp

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

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


可能是重复的问题:error LNK2005: already defined - C++ - Timo
1个回答

13
你的项目中有两个名为WorldObjects2的函数定义:一个在编译单元test.cpp中,另一个在编译单元main.cpp中,因为定义该函数的头文件被包含在这两个cpp文件中。
请使用函数说明符inline
inline void WorldObjects2(unsigned int mask)
{
    .......
}

或者将函数定义移至某个cpp文件中,在头文件中仅保留一个函数声明(不含其定义)。

另一种方法是将函数标记为具有内部链接性。例如,您可以添加关键字“静态”。

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

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

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

2
你知道为什么这种情况下预编译指令的 include guard 没有起作用吗? - Timo
1
@Timo 它有效。简单来说,有两个独立的编译单元,每个单元都包括头文件。 - Vlad from Moscow
阅读相关主题后,似乎“static”也是一种选择。在这里找到了一个解释:http://forums.codeguru.com/showthread.php?285375-inline-function-vs-static-function - Timo
@Timo 这取决于你是否希望这个函数是静态的。:) - Vlad from Moscow
你肯定是对的,但我觉得提到这个额外选项是一件好事。将函数设为静态也可以解决这个问题,但在另一个项目中可能不是正确的解决方案。 - Timo
@Timo,我按照你的建议做了。 - Vlad from Moscow

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接