2008-12-19 88 views
2

好了,所以我剛剛完成我最後的編譯器錯誤(所以我認爲),這些錯誤想出了:錯誤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

回答

10

大多數情況下,當鏈接失敗來檢測靜態成員那是因爲你忘了真正定義它的地方,因爲它是前指出:

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

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

但在你的情況,你是不僅缺少靜態變量,還包括所有其他成員,我敢打賭,你沒有鏈接項目中的實現文件(.cpp)。您必須提供一個編譯單元,用於定義標題中聲明的符號,並使環境編譯並將其鏈接在一起。如果符號屬於外部庫中的編譯單元(來自當前項目),那麼您必須記得鏈接庫。

2

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

0

在一個地方聲明一個變量並在另一個地方給它賦值不應該導致任何錯誤。確保在引用對象的所有文件的頂部包含WeaponsDB.h。

例如:在Driver.cpp的頂部,確保出現「#include WeaponsDB.h」。

希望這會有所幫助!

0

從閱讀您的意見,在其他人的答案,它看起來像你在一個函數內分配一個值。你需要有:

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

..在全球範圍內實現文件中,想必WeaponsDB.cpp的(沒有意思在函數中)。在這種情況下,「持續」是合適的。實際上,你可以跳過將它放在你的.cpp文件中的部分,直接在WeaponsDB.h中執行:

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

缺少很多靜態成員。難道你將靜態成員定義集中在一個文件中,然後你沒有鏈接該文件?