错误lnk2005已在.obj中定义

时间:2015-05-28 09:03:32

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

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

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 stduio 2013上运行这些代码时,它会抛出错误。它说error LNK2005: "void __cdecl World::WorldObjects2(unsigned int)" (?WorldObjects2@World@@YAXI@Z) already defined in main.obj。如何更正此错误?

2 个答案:

答案 0 :(得分:2)

您的项目有两个函数.box:after{ width: 350px; height: 50px; bottom: 26px; display: block; position:absolute; content: " "; z-index: -1; box-shadow: 0px 19px 8px -5px rgba(0,0,0,0.56); } 的定义:一个在编译单元WorldObjects2中,另一个在编译单元test.cpp中,因为定义函数的头包含在这两个cpp文件。

使用函数说明符main.cpp

inline

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

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

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

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

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

答案 1 :(得分:0)

我建议在test.h文件中使用include guard:

#ifndef TEST_H
#define TEST_H
namespace World
{
    enum Objects
    {
        TERRAIN = 1,
        BOX = 2,
        SPHERE = 4,
        CAPSULE = 8

    };  

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

void test();
#endif /* TEST_H */

有些人更喜欢使用#pragma once而不是if和define组合,但结果并不重要。

这两个选项将阻止编译器两次添加相同的头文件。如果两次添加相同的头文件,您不仅可以创建遇到的错误,还可以增加编译时间。