2010-11-03 63 views
0

我從compilator收到此錯誤的問題:C++/SDL雙列入

1>Linking... 
1>main.obj : error LNK2005: "int g_win_flags" ([email protected]@3HA) already defined in init.obj 
1>main.obj : error LNK2005: "struct SDL_Surface * g_screen" ([email protected]@[email protected]@A) already defined in init.obj 
1>MSVCRTD.lib(cinitexe.obj) : warning LNK4098: defaultlib 'msvcrt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library 
1>.\Debug\Heroes are back!.exe : fatal error LNK1169: one or more multiply defined symbols found 

它看起來像g_win_flags和g_screen兩次都包括在內,但我不明白爲什麼。 這裏是源:

的main.cpp

#include <iostream> 
#include "dec.h" 
#include "init.h" 

int main(int argc, char *argv[]){ 

    init(); 
    return 0; 
} 

dec.h

#ifndef DEC_H 
#define DEC_H 

#include <SDL.h> 
#include <iostream> 

#pragma comment(lib, "SDL.lib") 
#pragma comment(lib, "SDLmain.lib") 

using namespace std; 

int g_win_flags = SDL_HWSURFACE|SDL_DOUBLEBUF; 

SDL_Surface *g_screen = NULL; 

#endif 

init.h裏

#ifndef INIT_H 
#define INIT_H 

bool init(); 

#endif 

init.cpp

#include "dec.h" 

bool init(){ 
    if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER) == -1){ 
     cerr << "Unable to initialize SDL" << endl; 
     return false; 
    } 
    g_screen = SDL_SetVideoMode(640, 480, 0, g_win_flags); 

    return true; 
} 

有人可以幫忙嗎?在此先感謝,並有一個愉快的一天:)

+1

你不應該在除extern聲明以外的頭文件中定義變量。 – codymanix 2010-11-03 18:26:27

+0

僅供參考,不是編譯器錯誤,它是鏈接器錯誤。 – 2010-11-03 18:48:38

回答

3

您可以定義並初始化標題中的變量。

你應該剛剛宣佈他們在頭(dec.h)無需任何初始化:

extern int g_win_flags; 
extern SDL_Surface *g_screen; 

然後在一個文件中定義一次 - 大概dec.cpp - 與初始化。

就這樣,你在每個包含'dec.h'的源文件中定義它們,然後運行ODR - One Definition Rule。

2

在dec.h你想

extern int g_win_flags; 

extern SDL_Surface *g_screen; 

,然後定義和initalise他們只是dec.cpp

更新:

#include "dec.h" 
int g_win_flags = SDL_HWSURFACE|SDL_DOUBLEBUF; 

SDL_Surface *g_screen = NULL; 

一般的經驗法則是「頭文件中的任何內容都不應占用編譯器輸出中的任何空間」。 (顯然有一些例外)

實際上,這意味着extern變量聲明很好,函數聲明也是如此,但不是定義。

0

您已將文件包含到定義實例化變量的兩個不同源文件(init.cpp和main.cpp)中。

您需要一種方法來確保它們在除一個源文件之外的其他所有文件中都是「圖案」的。

+0

看到喬納森的答案在下面 - 這就是我的意思(但沒有) – KevinDTimm 2010-11-03 18:28:37

0

嗯,我試圖做什麼你告訴我的傢伙,但compilator抱怨:

1>.\heroes are back!\dec.cpp(2) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>.\heroes are back!\dec.cpp(4) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>.\heroes are back!\dec.cpp(4) : error C2040: 'g_screen' : 'int' differs in levels of indirection from 'SDL_Surface *' 

這裏是dec.h

#ifndef DEC_H 
#define DEC_H 

#include <SDL.h> 
#include <iostream> 

#pragma comment(lib, "SDL.lib") 
#pragma comment(lib, "SDLmain.lib") 

using namespace std; 

extern int g_win_flags; 

extern SDL_Surface *g_screen; 

#endif 

(分解)。cpp

#include "dec.h" 
g_win_flags = SDL_HWSURFACE|SDL_DOUBLEBUF; 

g_screen = NULL; 

這段代碼有什麼問題?對不起,問愚蠢的問題,但我只是在學習C++ :)

+0

你沒有在dec.cpp文件中指定類型,這是它告訴你的。你需要在頭文件中有'extern(type)(name);'和代碼中需要'(type)(name)=(value);'。 – ssube 2010-11-03 18:49:46