2011-10-19 2 views
0

この私は(C++リンカエラー)この何であるか見当がつかない

1>main_display.obj : error LNK2005: "struct ALLEGRO_DISPLAY * main_display" ([email protected]@[email protected]@A) already defined in event_queue.obj 
1>main.obj : error LNK2005: "struct ALLEGRO_DISPLAY * main_display" ([email protected]@[email protected]@A) already defined in event_queue.obj 
1>main.obj : error LNK2005: "struct ALLEGRO_TIMER * timer" ([email protected]@[email protected]@A) already defined in event_queue.obj 
1>main.obj : error LNK2005: "struct ALLEGRO_EVENT_QUEUE * event_queue" ([email protected]@[email protected]@A) already defined in event_queue.obj 
1>main_timer.obj : error LNK2005: "struct ALLEGRO_TIMER * timer" ([email protected]@[email protected]@A) already defined in event_queue.obj 

にこれを引き起こす可能性がありますどのような任意のアイデアを得ますか?

EDIT:

main_display.h:これらの構造は、ヘッダファイルに定義されているよう

#pragma once 

#include <allegro5/allegro.h> 
#include <stdio.h> 

#define SCREEN_W 640 
#define SCREEN_H 480 

extern ALLEGRO_DISPLAY *main_display = NULL; 

void display_init(); 
void destroy_display(); 

event_queue.h

#pragma once 

#include <stdio.h> 
#include <allegro5/allegro.h> 
#include "main_timer.h" 
#include "main_display.h" 

extern ALLEGRO_EVENT_QUEUE *event_queue = NULL; 

void event_queue_init(); 
void event_queue_destroy(); 
+0

私は構造体を持っていない....と名前は自由である... – Vladp

答えて

3

が見えます。その後、彼らは複数の翻訳単位に#includedです。特定の項目の定義が1つだけであるようにする必要があります。

これらはグローバル変数であるため、一般的にはヘッダーにexternというマークを付けて、それをいくつかの翻訳単位で定義して宣言しています。

+0

はそれを解決しました! :) extern remainderありがとう – Vladp

0

inline宣言を使用せずに、関数の実装をヘッダー(.h)ファイルに入れていると思います。

ヘッダーファイルが複数のソースに含まれているため、関数の本体が複数回コンパイルされます。リンカーは、関数を複数回見ていると不平を言っています。

0

異なるファイルに同じstructを定義しているようです。

実際のファイルを見ることなく、その約限り私が得るようだ...

関連する問題