0

我知道这是一个常见问题,但我很确定我包含文件的方式没有错误。

我会给你基本的文件。

主要.cpp:

#include "GameState.h"
#inlcude "Timer.h"

int main ( int argc, char** argv ) {

游戏状态.h:

#pragma once
#include "Character.h"

字符.h:

#pragma once
#include "Setup.h"

设置.h:

#pragma once

#include "SDL.h"
#include "SDL_main.h"
#include "SDL_image.h"

错误报告:

Error   1   error LNK2005: "void __cdecl apply_surface(int,int,struct SDL_Surface *,struct SDL_Surface *,struct SDL_Rect *)" (?apply_surface@@YAXHHPAUSDL_Surface@@0PAUSDL_Rect@@@Z) already defined in Character.obj   C:\Users\Jim\Documents\C++\herorpg\herorpg\Main.obj
Error   2   error LNK2005: "bool __cdecl init(struct SDL_Surface * &)" (?init@@YA_NAAPAUSDL_Surface@@@Z) already defined in Character.obj   C:\Users\Jim\Documents\C++\herorpg\herorpg\Main.obj
Error   3   error LNK2005: "bool __cdecl load_files(struct SDL_Surface * * const)" (?load_files@@YA_NQAPAUSDL_Surface@@@Z) already defined in Character.obj C:\Users\Jim\Documents\C++\herorpg\herorpg\Main.obj
Error   4   error LNK2005: "struct SDL_Surface * __cdecl load_image(char *)" (?load_image@@YAPAUSDL_Surface@@PAD@Z) already defined in Character.obj    C:\Users\Jim\Documents\C++\herorpg\herorpg\Main.obj
Error   6   error LNK1169: one or more multiply defined symbols found   C:\Users\Jim\Documents\C++\herorpg\Debug\herorpg.exe

我包含的内容有什么问题吗?如果您认为需要更多信息,我将发布完整代码。只是之前觉得很麻烦。

4

3 回答 3

2

C++ 有一个规则,称为单一定义规则。除其他外,此规则指定在您的程序中不能有多个函数定义。您不能有两个都定义一个函数的翻译单元,否则您将违反此规则。您可以将翻译单元视为一个.cpp文件,其所有标题都包含在适当的位置。

因此,如果您有一个头文件,foo.h它看起来像这样:

#ifndef FOO_H
#define FOO_H

int foo() { return 5; }

#endif

然后你在两个或多个.cpp文件中包含这个标题,每个翻译单元都有自己的定义。这违反了单一定义规则。

为了解决这个问题,你的头文件应该像这样给出一个函数声明:

#ifndef FOO_H
#define FOO_H

int foo();

#endif

然后,在相应的foo.cpp文件中,给出函数的定义:

#include "foo.h"

int foo() { return 5; }

这意味着只有foo.cpp翻译单元才有foo. 在其他翻译单元中的任何使用foo都将该定义相关联。

另一种方法是将函数声明为inline,如下所示:

#ifndef FOO_H
#define FOO_H

inline int foo() { return 5; }

#endif

允许这样做的原因是因为每个翻译必须能够看到这样一个函数的定义才能内联它。但是,我不建议随意使用inline

于 2013-05-06T13:47:07.980 回答
0

链接器错误不是由#include错误引起的。当编译器找不到某些东西的定义时,通常会发生链接器错误。或者如果它找到多个定义(例如在这种情况下)

检查您是否正在链接多个 SDL 库,或者您是否在代码中的某个位置自己定义了函数

于 2013-05-06T13:39:19.527 回答
0

可能的原因:

  1. 在头文件中定义函数。函数只能在 .cpp 文件中定义。

  2. 循环的头文件,包括。比如:ah 包含 bh,bh 包含 ch,ch 包含 ah 有时循环包含不明显,但确实会发生。“#pragma once”只能防止一个头文件被多次包含,但不能防止循环包含。为了解决这个问题,使用“前向声明”来替换一些#include 语句。

关于前向声明的一些链接:

http://en.wikipedia.org/wiki/Forward_declaration

我什么时候可以使用前向声明?

http://msdn.microsoft.com/en-us/library/f432x8c6(v=vs.80).aspx

于 2013-05-06T14:06:37.317 回答