我不知道这是什么(C ++链接器错误)

时间:2011-10-19 19:38:10

标签: c++ linker

得到这个

1>main_display.obj : error LNK2005: "struct ALLEGRO_DISPLAY * main_display" (?main_display@@3PAUALLEGRO_DISPLAY@@A) already defined in event_queue.obj
1>main.obj : error LNK2005: "struct ALLEGRO_DISPLAY * main_display" (?main_display@@3PAUALLEGRO_DISPLAY@@A) already defined in event_queue.obj
1>main.obj : error LNK2005: "struct ALLEGRO_TIMER * timer" (?timer@@3PAUALLEGRO_TIMER@@A) already defined in event_queue.obj
1>main.obj : error LNK2005: "struct ALLEGRO_EVENT_QUEUE * event_queue" (?event_queue@@3PAUALLEGRO_EVENT_QUEUE@@A) already defined in event_queue.obj
1>main_timer.obj : error LNK2005: "struct ALLEGRO_TIMER * timer" (?timer@@3PAUALLEGRO_TIMER@@A) already defined in event_queue.obj

任何想法会导致什么?

修改

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();

3 个答案:

答案 0 :(得分:3)

看起来这些结构是在头文件中定义的。然后他们#included进入多个翻译单元。你需要使它只有一个特定项目的定义。

鉴于这些是全局变量,通常这样做的方法是通过在标题中标记extern来声明它们,然后在某个翻译单元中定义它们。

答案 1 :(得分:0)

我猜你在不使用inline声明的情况下将函数实现放入头文件(.h)。

由于头文件包含在多个源中,因此函数体将被多次编译。链接器抱怨不止一次看到这个函数。

答案 2 :(得分:0)

看起来您在不同的文件中定义了相同的struct

如果没有真正看到文件,那就是我得到的......