错误LNK2001和错误LNK2019(C++) - 请求一些了解这些错误

问题描述:

好了,所以我刚刚完成我最后的编译器错误(所以我认为),这些错误想出了:错误LNK2001和错误LNK2019(C++) - 请求一些了解这些错误

1>GameEngine.obj : error LNK2001: unresolved external symbol "public: static double WeaponsDB::PI" ([email protected]@@2NA) 
1>Component.obj : error LNK2001: unresolved external symbol "public: static double WeaponsDB::PI" ([email protected]@@2NA) 
1>Coordinate.obj : error LNK2019: unresolved external symbol "public: static double WeaponsDB::PI" ([email protected]@@2NA) referenced in function "public: double __thiscall Coordinate::distanceFrom(class Coordinate *)" ([email protected]@@[email protected]@Z) 
1>Driver.obj : error LNK2001: unresolved external symbol "public: static double WeaponsDB::PI" ([email protected]@@2NA) 
1>Environment.obj : error LNK2001: unresolved external symbol "public: static double WeaponsDB::PI" ([email protected]@@2NA) 
1>Environment.obj : error LNK2001: unresolved external symbol "public: static bool Environment::spyFlag" ([email protected]@@2_NA) 
1>Environment.obj : error LNK2001: unresolved external symbol "private: static class Environment * Environment::instance_" ([email protected]@@[email protected]) 
1>Environment.obj : error LNK2019: unresolved external symbol "public: static void __cdecl Environment::spyAlertOver(void)" ([email protected]@@SAXXZ) referenced in function "public: void __thiscall Environment::notificationOfSpySuccess(void)" ([email protected]@@QAEXXZ) 
1>GameDriver.obj : error LNK2019: unresolved external symbol "public: static void __cdecl MainMenu::gameOver(int)" ([email protected]@@[email protected]) referenced in function "public: static void __cdecl GameDriver::run(void)" ([email protected]@@SAXXZ) 
1>GameDriver.obj : error LNK2019: unresolved external symbol "public: static void __cdecl GameDriver::gatherInput(void)" ([email protected]@@SAXXZ) referenced in function "public: static void __cdecl GameDriver::run(void)" ([email protected]@@SAXXZ) 
1>GameDriver.obj : error LNK2019: unresolved external symbol "public: static void __cdecl GameDriver::ticker(void)" ([email protected]@@SAXXZ) referenced in function "public: static void __cdecl GameDriver::run(void)" ([email protected]@@SAXXZ) 
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static int GameDriver::ticks" ([email protected]@@2HA) 
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static bool GameDriver::evaluatingInputFlag" ([email protected]@@2_NA) 
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static bool GameDriver::keyQuitFlag" ([email protected]@@2_NA) 
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static bool GameDriver::keyToggleWeaponRightFlag" ([email protected]@@2_NA) 
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static bool GameDriver::keyToggleWeaponLeftFlag" ([email protected]@@2_NA) 
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static bool GameDriver::keyFireFlag" ([email protected]@@2_NA) 
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static bool GameDriver::keyLeftFlag" ([email protected]@@2_NA) 
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static bool GameDriver::keyRightFlag" ([email protected]@@2_NA) 
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static bool GameDriver::keyUpFlag" ([email protected]@@2_NA) 
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static bool GameDriver::keyDownFlag" ([email protected]@@2_NA) 
1>GUI_Env.obj : error LNK2001: unresolved external symbol "private: static struct BITMAP * GUI_Env::buffer" ([email protected][email protected]@[email protected]@A) 
1>GUI_Info.obj : error LNK2001: unresolved external symbol "private: static struct BITMAP * GUI_Info::buffer" ([email protected][email protected]@[email protected]@A) 
1>MenuDriver.obj : error LNK2019: unresolved external symbol "public: static void __cdecl MainMenu::displayMenu(void)" ([email protected]@@SAXXZ) referenced in function "public: static void __cdecl MenuDriver::start(void)" ([email protected]@@SAXXZ) 
1>SpaceObjectFactory.obj : error LNK2001: unresolved external symbol "private: static class SpaceObjectFactory * SpaceObjectFactory::_instance" ([email protected]@@[email protected]) 
1>Spy.obj : error LNK2019: unresolved external symbol "public: virtual bool __thiscall UnFormationable::sameTypeOfSpaceObjectAs(class SpaceObject *)" ([email protected]@@[email protected]@@Z) referenced in function "public: virtual bool __thiscall Spy::sameTypeOfSpaceObjectAs(class SpaceObject *)" ([email protected]@@[email protected]@@Z) 
1>WeaponsDB.obj : error LNK2001: unresolved external symbol "private: static class WeaponsDB * WeaponsDB::_instance" ([email protected]@@[email protected]) 
1>C:\Users\Owner\Desktop\Bosconian\code\Bosconian\Debug\Bosconian.exe : fatal error LNK1120: 23 unresolved externals 

好吧,这里的简要概述。

PI是WeaponsDB静态常量,并且通过使用WeaponsDB :: PI和适当的#include(这有什么错呢?)

大多数其他错误,从静态的变量和定时器的静态方法阻止其他类引用来自allegro游戏库。

什么原因导致这些错误,我该如何摆脱它们?

在此先感谢

----------------编辑-------------------

按要求,WeaponsDB :: PI被声明和定义。 它在WeaponsDB.h声明:

public: 
    static double PI; 

却是在另一个类Driver.cpp定义:

WeaponsDB::PI = 4*atan(1.0); 

如果这是我的代码的一个问题我很想知道为什么这会导致错误。

+0

您需要发布声明PI的.h文件的部分以及定义它的.cpp文件。 – 2008-12-19 05:20:20

大多数情况下,当链接失败来检测静态成员那是因为你忘了真正定义它的地方,因为它是前指出:

// header 
class X { 
    static const int y; 
}; 

// cpp 
const int X::y = 1; 

但在你的情况,你是不仅缺少静态变量,还包括所有其他成员,我敢打赌,你没有链接项目中的实现文件(.cpp)。您必须提供一个编译单元,用于定义标题中声明的符号,并使环境编译并将其链接在一起。如果符号属于外部库中的编译单元(来自当前项目),那么您必须记得链接库。

WeaponsDB::PI = 4*atan(1.0); 

将值分配给PI。它不为它创造空间(不定义它)。

这为(定义)PI创建空间并为其赋值(初始化)。

double WeaponsDB::PI = 4*atan(1.0); 

你也应该把PI标记为“static const”而不是“static”。静态使它由类而不是由实例拥有。 const使它不可变(并启用各种优化)。

您也可以考虑使用math.h中的M_PI,而不是重新创建常量。

编辑:括号中加入更精确的术语:定义,由于WP的评论而初始化。

+0

嗯......变化 double WeaponsDB :: PI = 4 * atan(1.0); 似乎并不适用于我(它会抛出关于重定义的错误) 我不把它设为const的原因是我将不得不在编译时定义该值,并且由于某些原因我无法将浮点定义为const 。 – Chad 2008-12-19 05:40:35

+0

“它抛出了关于重定义的错误”,因为你没有遵从别人对你的问题发表的评论:“你需要发布声明PI的.h文件的一部分以及定义它的.cpp文件。”将声明保存在.h文件中。将一个定义放在一个cpp文件中。 – 2008-12-19 06:13:40

+0

我看到这个答案可能不够清楚,虽然它是正确的。 “为PI分配一个值,但不为其创建空间”=赋值但未定义。 “为PI创建空间并为其分配值”=定义和初始化。 – 2008-12-19 06:16:05

在一个地方声明一个变量并在另一个地方给它赋值不应该导致任何错误。确保在引用对象的所有文件的顶部包含WeaponsDB.h。

例如:在Driver.cpp的顶部,确保出现“#include WeaponsDB.h”。

希望这会有所帮助!

从阅读您的意见,在其他人的答案,它看起来像你在一个函数内分配一个值。你需要有:

double WeaponsDB::PI = 4*atan(1.0); 

..在全球范围内实现文件中,想必WeaponsDB.cpp的(没有意思在函数中)。在这种情况下,“持续”是合适的。实际上,你可以跳过将它放在你的.cpp文件中的部分,直接在WeaponsDB.h中执行:

public: 
    static const double PI = 4*atan(1.0); 

缺少很多静态成员。难道你将静态成员定义集中在一个文件中,然后你没有链接该文件?