错误链接2005已经在.obj中定义

Error lnk2005 already defined in .obj

本文关键字:obj 定义 链接 2005 错误      更新时间:2023-10-16

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

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。我怎样才能纠正这个错误?

您的项目有两个函数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)
        {
            .......
        }
    }  
}