2

よし、最後のコンパイラ エラーを終了したところ (そう思った)、次のエラーが表示されました。

1>GameEngine.obj : error LNK2001: unresolved external symbol "public: static double WeaponsDB::PI" (?PI@WeaponsDB@@2NA)
1>Component.obj : error LNK2001: unresolved external symbol "public: static double WeaponsDB::PI" (?PI@WeaponsDB@@2NA)
1>Coordinate.obj : error LNK2019: unresolved external symbol "public: static double WeaponsDB::PI" (?PI@WeaponsDB@@2NA) referenced in function "public: double __thiscall Coordinate::distanceFrom(class Coordinate *)" (?distanceFrom@Coordinate@@QAENPAV1@@Z)
1>Driver.obj : error LNK2001: unresolved external symbol "public: static double WeaponsDB::PI" (?PI@WeaponsDB@@2NA)
1>Environment.obj : error LNK2001: unresolved external symbol "public: static double WeaponsDB::PI" (?PI@WeaponsDB@@2NA)
1>Environment.obj : error LNK2001: unresolved external symbol "public: static bool Environment::spyFlag" (?spyFlag@Environment@@2_NA)
1>Environment.obj : error LNK2001: unresolved external symbol "private: static class Environment * Environment::instance_" (?instance_@Environment@@0PAV1@A)
1>Environment.obj : error LNK2019: unresolved external symbol "public: static void __cdecl Environment::spyAlertOver(void)" (?spyAlertOver@Environment@@SAXXZ) referenced in function "public: void __thiscall Environment::notificationOfSpySuccess(void)" (?notificationOfSpySuccess@Environment@@QAEXXZ)
1>GameDriver.obj : error LNK2019: unresolved external symbol "public: static void __cdecl MainMenu::gameOver(int)" (?gameOver@MainMenu@@SAXH@Z) referenced in function "public: static void __cdecl GameDriver::run(void)" (?run@GameDriver@@SAXXZ)
1>GameDriver.obj : error LNK2019: unresolved external symbol "public: static void __cdecl GameDriver::gatherInput(void)" (?gatherInput@GameDriver@@SAXXZ) referenced in function "public: static void __cdecl GameDriver::run(void)" (?run@GameDriver@@SAXXZ)
1>GameDriver.obj : error LNK2019: unresolved external symbol "public: static void __cdecl GameDriver::ticker(void)" (?ticker@GameDriver@@SAXXZ) referenced in function "public: static void __cdecl GameDriver::run(void)" (?run@GameDriver@@SAXXZ)
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static int GameDriver::ticks" (?ticks@GameDriver@@2HA)
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static bool GameDriver::evaluatingInputFlag" (?evaluatingInputFlag@GameDriver@@2_NA)
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static bool GameDriver::keyQuitFlag" (?keyQuitFlag@GameDriver@@2_NA)
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static bool GameDriver::keyToggleWeaponRightFlag" (?keyToggleWeaponRightFlag@GameDriver@@2_NA)
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static bool GameDriver::keyToggleWeaponLeftFlag" (?keyToggleWeaponLeftFlag@GameDriver@@2_NA)
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static bool GameDriver::keyFireFlag" (?keyFireFlag@GameDriver@@2_NA)
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static bool GameDriver::keyLeftFlag" (?keyLeftFlag@GameDriver@@2_NA)
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static bool GameDriver::keyRightFlag" (?keyRightFlag@GameDriver@@2_NA)
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static bool GameDriver::keyUpFlag" (?keyUpFlag@GameDriver@@2_NA)
1>GameDriver.obj : error LNK2001: unresolved external symbol "public: static bool GameDriver::keyDownFlag" (?keyDownFlag@GameDriver@@2_NA)
1>GUI_Env.obj : error LNK2001: unresolved external symbol "private: static struct BITMAP * GUI_Env::buffer" (?buffer@GUI_Env@@0PAUBITMAP@@A)
1>GUI_Info.obj : error LNK2001: unresolved external symbol "private: static struct BITMAP * GUI_Info::buffer" (?buffer@GUI_Info@@0PAUBITMAP@@A)
1>MenuDriver.obj : error LNK2019: unresolved external symbol "public: static void __cdecl MainMenu::displayMenu(void)" (?displayMenu@MainMenu@@SAXXZ) referenced in function "public: static void __cdecl MenuDriver::start(void)" (?start@MenuDriver@@SAXXZ)
1>SpaceObjectFactory.obj : error LNK2001: unresolved external symbol "private: static class SpaceObjectFactory * SpaceObjectFactory::_instance" (?_instance@SpaceObjectFactory@@0PAV1@A)
1>Spy.obj : error LNK2019: unresolved external symbol "public: virtual bool __thiscall UnFormationable::sameTypeOfSpaceObjectAs(class SpaceObject *)" (?sameTypeOfSpaceObjectAs@UnFormationable@@UAE_NPAVSpaceObject@@@Z) referenced in function "public: virtual bool __thiscall Spy::sameTypeOfSpaceObjectAs(class SpaceObject *)" (?sameTypeOfSpaceObjectAs@Spy@@UAE_NPAVSpaceObject@@@Z)
1>WeaponsDB.obj : error LNK2001: unresolved external symbol "private: static class WeaponsDB * WeaponsDB::_instance" (?_instance@WeaponsDB@@0PAV1@A)
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);

これが私のコードの問題の 1 つである場合、これがエラーを引き起こす理由を知りたいです。

4

5 に答える 5

10

ほとんどの場合、リンカが静的メンバーの検出に失敗するのは、前に指摘したように、実際にどこかで定義するのを忘れたためです。

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

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

しかし、あなたの場合、静的変数だけでなく、残りのすべてのメンバーも欠落しているので、プロジェクト内の実装ファイル(.cpp)をリンクしていないことになります。ヘッダーで宣言されたシンボルを定義するコンパイル単位を提供し、環境にコンパイルしてリンクさせる必要があります。シンボルが(現在のプロジェクトの)外部ライブラリのコンパイルユニットに属している場合は、ライブラリとリンクすることを忘れないでください。

于 2008-12-19T07:15:19.823 に答える
2

これ

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

値を PI に割り当てます。そのためのスペースを作成しません (定義しません)。

これにより、PI 用のスペースが作成 (定義) され、PI に値が割り当てられます (初期化されます)。

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

おそらく、PI を「static」だけでなく「static const」としてもマークする必要があります。static は、インスタンスではなくクラスによって所有されます。const はそれを不変にします (そして、さまざまな最適化を有効にします)。

定数を再作成する代わりに、math.h から M_PI を使用することも検討してください。

編集:より正確な用語を括弧内に追加: WP のコメントによる定義、初期化。

于 2008-12-19T05:34:47.717 に答える
0

他の人の回答でコメントを読むと、関数内で値を割り当てているように見えます。次のものが必要です。

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

.. 実装ファイル (おそらく WeaponsDB.cpp) のグローバル スコープ (関数内ではないことを意味します) 内。その場合、それを「const」するのが適切でしょう。実際、.cpp に入れる部分をスキップして、WeaponsDB.h で直接行うことができます。

public:
    static const double PI = 4*atan(1.0);
于 2008-12-19T18:37:44.823 に答える
0

非常に多くの静的メンバーが欠落しています。静的メンバーの定義を 1 つのファイルに集中させて、そのファイルをリンクしていない可能性はありますか?

于 2008-12-19T18:41:09.403 に答える
0

ある場所で変数を宣言し、別の場所で値を割り当てても、エラーは発生しません。そこで定義されたオブジェクトを参照するすべてのファイルの先頭に WeaponsDB.h を必ず含めてください。

例: Driver.cpp の先頭に、「#include WeaponsDB.h」が表示されていることを確認します。

お役に立てれば!

于 2008-12-19T05:35:17.967 に答える