导致"错误的原因LNK2005:已在.obj"中定义我的代码中的错误?

时间:2018-01-07 01:38:53

标签: c++ compiler-errors lnk2005

我想知道在我的代码中导致双定义链接器错误的原因。它让我困惑,因为它似乎没有任何理由。我不认为我{{}} {{}} {{}}} {{}}} {{}} {{}} {{}} {{}} {{}} {{}} / p>

要清楚,我不是在问这些错误是什么意思,我在问我的代码是什么导致它。我已经在这个网站(以及其他网站)上研究了它的含义,并且无法找到与我的代码中可能产生的内容相关的答案。

顺便说一下,我使用的是Visual Studio 2017

以下是错误:

#include

这是我的代码结构:

SimpleTypes.h:

.h

ComplexTypes.h:

#include

ObjectHandler.cpp:

1>ObjectHandler.cpp

1>Main.cpp

1>Generating Code...

1>ObjectHandler.obj : error LNK2005: "void __cdecl pixelsInit(void)" (?
pixelsInit@@YAXXZ) already defined in Main.obj

1>ObjectHandler.obj : error LNK2005: "void __cdecl pixelsUpdate(void)" (?
pixelsUpdate@@YAXXZ) already defined in Main.obj

1>ObjectHandler.obj : error LNK2005: "void __cdecl spritesInit(void)" (?
spritesInit@@YAXXZ) already defined in Main.obj

1>ObjectHandler.obj : error LNK2005: "void __cdecl spritesUpdate(void)" (?
spritesUpdate@@YAXXZ) already defined in Main.obj

1>ObjectHandler.obj : error LNK2005: "class std::vector<struct pixel,class 
std::allocator<struct pixel> > pixels" (?pixels@@3V?$vector@Upixel@@V?
$allocator@Upixel@@@std@@@std@@A) already defined in Main.obj

1>ObjectHandler.obj : error LNK2005: "class std::map<class 
std::basic_string<char,struct std::char_traits<char>,class 
std::allocator<char> >,struct sprite,struct std::less<class 
std::basic_string<char,struct std::char_traits<char>,class 
std::allocator<char> > >,class std::allocator<struct std::pair<class 
std::basic_string<char,struct std::char_traits<char>,class 
std::allocator<char> > const ,struct sprite> > > sprites" (?sprites@@3V?
$map@V?$basic_string@DU?$char_traits@D@std@@V?
$allocator@D@2@@std@@Usprite@@U?$less@V?$basic_string@DU?
$char_traits@D@std@@V?$allocator@D@2@@std@@@2@V?$allocator@U?$pair@$$CBV?
$basic_string@DU?$char_traits@D@std@@V?
$allocator@D@2@@std@@Usprite@@@std@@@2@@std@@A) already defined in Main.obj

1>fatal error LNK1169: one or more multiply defined symbols found

Main.cpp的

#pragma once

struct loc {

    int x;
    int y;
    int d;
    int s;

};

struct color {

    _int8 r;
    _int8 g;
    _int8 b;
    _int8 a;

};

1 个答案:

答案 0 :(得分:0)

在您的项目中,您正在编译ObjectHandler.cpp作为独立的翻译单元。同时,您还将ObjectHandler.cpp包含在Main.cpp中,然后再将其作为Main.cpp的一部分进行编译。

因此,ObjectHandler.cpp中定义的所有内容在您的程序中定义了两次。因此错误。

问题是:为什么要将ObjectHandler.cpp纳入Main.cpp?你试图通过那种方式实现什么目标?

如果您出于某种非正统的原因,确实希望/必须将ObjectHandler.cpp包含到Main.cpp中并将其编译为Main.cpp的一部分,然后停止将ObjectHandler.cpp编译为同时是一个独立的翻译单位。

同时,在这种情况下,更传统的方法是为ObjectHandler.h写一个正确的ObjectHandler.cpp文件。像

这样的东西
#pragma once
#include "ComplexTypes.h"
#include <string>
#include <map>
#include <vector>

extern std::vector<pixel> pixels;
extern std::map<std::string, sprite> sprites;

void pixelsInit();
void spritesInit();
void pixelsUpdate();
void spritesUpdate();

并将其包含在Main.cpp中。

您的ObjectHandler.cpp可能如下所示

#include "ObjectHandler.h"

std::vector<pixel> pixels;
std::map<std::string, sprite> sprites;

void pixelsInit(){}
void spritesInit(){}
void pixelsUpdate(){}
void spritesUpdate(){}

请注意重要细节:.h文件仅包含声明(函数没有使用extern声明实体和对象),而.cpp文件包含 definitions (函数的主体和对象声明没有extern