我认为ifndef something #define something body #endif
解决了这个错误,所以我不确定为什么会这样。
//Library.h
#ifndef __LIBRARY__
#define __LIBRARY__
#include <iostream>
#include <string>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <cstdarg>
#include <vector>
#include <ctime>
#include <cmath>
#include <cstdlib>
//file includes
#include "Globals.h"
using namespace std;
#endif //__LIBRARY__
-
//globals.h
//global variables
#ifndef __GLOBAL__
#define __GLOBAL__
#include <vector>
#include <iostream>
#include <string>
//prototypes
bool Poglathon(std::vector<std::string>& text);
void NPCTalk(std::string const& speaker,std::vector<std::string> const& text);
void wait(double seconds);
//player stats
std::string name;
double str; //strength
double wis; //wisdom
double ref; //reflex
double hp; //health points
double i; //initiative
double inte; //intelligence
double c; //courage
int gold; //gold
int xp; //experience
int ap; //armour points
int wd; //weapon damage
int lvl; //level
int sp; //skill points
#endif //__GLOBAL__
然后还有另外两个包含“Library.h”的cpp文件。
答案 0 :(得分:12)
问题是在你的globals.h头文件中,你声明了一组默认具有外部链接的变量:即所有全局变量!
当您在头文件中对函数进行原型化时,您声明一个函数,但不是定义它。拥有相同函数的多个声明是完全合法的,这就是为什么如果几个不同的文件都#include
相同的标题并声明相同的函数,那就完全没问题了。另一方面,如果头文件中有全局变量,则定义这些变量。变量只能在C ++中定义一次(这称为单定义规则),如果多个文件定义相同的变量或函数,则会导致链接器错误,因为链接器不知道哪个要使用的版本。顺便说一下,这就是你没有#include
.cpp文件的原因,因为如果你这样做,你就会多次定义该标题导出的所有函数。
要解决此问题,请在标题中使用extern
关键字将这些变量 definitions 更改为变量声明:
//player stats
extern std::string name;
extern double str; //strength
extern double wis; //wisdom
extern double ref; //reflex
extern double hp; //health points
extern double i; //initiative
extern double inte; //intelligence
extern double c; //courage
extern int gold; //gold
extern int xp; //experience
extern extern int ap; //armour points
extern int wd; //weapon damage
extern int lvl; //level
extern int sp; //skill points
这将允许任意数量的文件到#include
这个标题,因为它们都没有实际定义变量;他们只是声明变量将存在于某个地方。然后,您应该创建一个新的.cpp文件,可能是globals.cpp,它实际上定义了变量:
#include "globals.h"
std::string name;
double str; //strength
double wis; //wisdom
double ref; //reflex
double hp; //health points
double i; //initiative
double inte; //intelligence
double c; //courage
int gold; //gold
int xp; //experience
int ap; //armour points
int wd; //weapon damage
int lvl; //level
int sp; //skill points
这些是变量的实际定义,因为它们只存在于一个地方(globals.cpp),所以不会再出现链接器错误。
希望这有帮助!
答案 1 :(得分:3)
您的C ++代码存在许多问题
除此之外: