为什么Code :: Blocks显示多个错误定义?

时间:2012-06-25 11:59:39

标签: c++ codeblocks definition

我正在使用代码here,我希望所有调用SDL函数的函数都在不同的头文件而不是主.cpp文件中。所以我创建了一个名为Methods.h的新文件。 这是文件的样子:

main.cpp:

#include "Methods.h"
...

Methods.h:

#include "SDL/SDL.h"
#include "SDL/SDL_opengl.h"
....

我从main中删除了所有函数并将它们放在Methods.h中

当我尝试构建项目时,它会显示“多重定义错误”。

/media/Data1/Projects/OpenGL/Game2/Methods.h|29|multiple definition of `event'|
obj/Debug/main.o:/media/Data1/Projects/OpenGL/Game2/Methods.h|29|first defined here|
obj/Debug/src/Machine.o||In function `drawFrame()':|
/media/Data1/Projects/OpenGL/Game2/Methods.h|29|multiple definition of `drawFrame()'|
obj/Debug/main.o:/media/Data1/Projects/OpenGL/Game2/Methods.h|29|first defined here|
obj/Debug/src/Machine.o||In function `init_GL()':|
/media/Data1/Projects/OpenGL/Game2/Methods.h|73|multiple definition of `init_GL()'|
obj/Debug/main.o:/media/Data1/Projects/OpenGL/Game2/Methods.h|73|first defined here|
obj/Debug/src/Machine.o||In function `init()':|
/media/Data1/Projects/OpenGL/Game2/Methods.h|97|multiple definition of `init()'|
obj/Debug/main.o:/media/Data1/Projects/OpenGL/Game2/Methods.h|97|first defined here|
obj/Debug/src/Machine.o||In function `clean_up()':|
/media/Data1/Projects/OpenGL/Game2/Methods.h|123|multiple definition of `clean_up()'|
obj/Debug/main.o:/media/Data1/Projects/OpenGL/Game2/Methods.h|123|first defined here|

2 个答案:

答案 0 :(得分:3)

看起来你的头文件中有一些函数定义,这意味着你将从包含头文件的每个源文件中获得每个函数的单独定义。需要声明它们inline,以便在包含标题的每个翻译单元中定义它们:

// Methods.h
#ifndef METHODS_H
#define METHODS_H

inline void initGL() {
    // do stuff
}

#endif

或者,您可以在标题中声明它们,并将定义移动到源文件:

// Methods.h
#ifndef METHODS_H
#define METHODS_H

void initGL();

#endif

// Methods.cpp
#include "Methods.h"

void initGL() {
    // do stuff
}

还有一个全局变量。如果要保留它,则必须将定义移动到源文件中,并在头文件中声明它extern。或者,您可以使用访问静态变量的函数替换它:

inline SDL_Event & event() {
    static SDL_Event instance;
    return instance;
}

这样做的好处和缺点是,它是在第一次调用函数时初始化的。

答案 1 :(得分:1)

使用file-new-file-source文件等在codeblocks中添加文件时,会出现一个屏幕,询问您是否要将该文件包含在调试版和发行版中。如果勾选方框,当然我想要包含它们,为什么还要添加文件呢?然后代码块会自动包含您的文件。当您明确地在代码中包含该文件时,您将复制它自动执行的操作。因此,添加文件时不要勾选这些框,因为结果非常混乱。今天有这个。

欢呼声

波奇