Multiple Definition (LNK2005) errors

2019-01-20 20:26发布

问题:

I recently tried to create a global header file which would have all definitions of error codes (i.e. NO_ERROR, SDL_SCREEN_FLIP_ERROR, etc.) these would just be integers which I would define here.

I included these in both of my .cpp files, however I am getting an error where it is stated that I am defining then twice.

globals.h:

#pragma once

// error related globals
int SCREEN_LOAD_ERROR = 1;
int NO_ERROR = 0;

main.cpp:

#include "globals.h"
#include "cTile.h"
/* rest of the code */

cTile.h:

#pragma once
#include "globals.h"

class cTile {
};

It is complaining that SCREEN_LOAD_ERROR and NO_ERROR are defined twice, but as far as I know #pragma once should prevent this (I also tried #ifndef, but this also did not work).

compiler output:

1>main.obj : error LNK2005: "int SCREEN_LOAD_ERROR" (?SCREEN_LOAD_ERROR@@3HA) already defined in cTile.obj 1>main.obj : error LNK2005: "int NO_ERROR" (?NO_ERROR@@3HA) already defined in cTile.obj

Am I missing something?

回答1:

Do not declare variables inside your header file.
When you declare a variable in header file a copy of the variable gets created in each translation unit where you include the header file.

Solution is:
Declare them extern inside one of your header file and define them in exactly one of your cpp file.

globals.h:

extern int SCREEN_LOAD_ERROR;
extern int NO_ERROR;

globals.cpp:

#include "globals.h"
int SCREEN_LOAD_ERROR = 0;
int NO_ERROR = 0;

main.cpp:

#include "globals.h"

cTile.h:

#include "globals.h"


回答2:

You could simply use an enum:

globals.h:

enum
{
    SCREEN_LOAD_ERROR = 1,
    NO_ERROR = 0,
    // ...
}


回答3:

using #ifndef works fine.(Although it works, this is not best practice). try like this:

globals.h

#ifndef GLOBALS
#define GLOBALS

int SCREEN_LOAD_ERROR = 1;
int NO_ERROR = 0;

#endif

cTile.h:

#include "globals.h"

class cTile {
};

main.cpp:

#include "globals.h"
#include "cTile.h"
/* rest of the code */