我知道这是一个常见问题,但我很确定如何包含文件没有错误。
我会给你基本文件。
#include "GameState.h"
#inlcude "Timer.h"
int main ( int argc, char** argv ) {
#pragma once
#include "Character.h"
#pragma once
#include "Setup.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
我所包含的内容有什么问题吗?如果您认为需要更多信息,我会发布完整的代码。之前看起来好像很讨厌。
答案 0 :(得分: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
。
答案 1 :(得分:0)
链接器错误不是由#include
错误引起的。链接器错误通常发生在编译器无法找到某些内容的定义时。或者,如果它找到多个定义(例如在这种情况下)
检查您是否与多个SDL库链接,或者您是否在代码中自己定义了这些函数
答案 2 :(得分:0)
可能的原因:
在头文件中定义函数。函数只应在.cpp文件中定义。
循环头文件包括。像:a.h包括b.h,b.h包括c.h,c.h包括a.h.有时循环包括不明显,但确实发生了。 “#pragma once”只能阻止一个头文件被包含多次,但不能阻止循环包含。要解决这个问题,可以使用“forward declaration”来替换一些#include语句。
关于前瞻性声明的一些链接:
http://en.wikipedia.org/wiki/Forward_declaration
When can I use a forward declaration?
http://msdn.microsoft.com/en-us/library/f432x8c6(v=vs.80).aspx