1

我在这里使用代码,我希望所有调用 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|
4

2 回答 2

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;
}

这具有优点和缺点,它在第一次调用函数时被初始化。

于 2012-06-25T12:06:34.523 回答
3

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

干杯

波奇

于 2014-05-21T20:36:55.903 回答