得到这个
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();
答案 0 :(得分:3)
看起来这些结构是在头文件中定义的。然后他们#included
进入多个翻译单元。你需要使它只有一个特定项目的定义。
鉴于这些是全局变量,通常这样做的方法是通过在标题中标记extern
来声明它们,然后在某个翻译单元中定义它们。
答案 1 :(得分:0)
我猜你在不使用inline
声明的情况下将函数实现放入头文件(.h)。
由于头文件包含在多个源中,因此函数体将被多次编译。链接器抱怨不止一次看到这个函数。
答案 2 :(得分:0)
看起来您在不同的文件中定义了相同的struct
。
如果没有真正看到文件,那就是我得到的......