エラーLNK2001とエラーLNK2019(C ++) - いくつかは、これらのエラーについての学習を要求

StackOverflow https://stackoverflow.com/questions/380153

  •  22-08-2019
  •  | 
  •  

質問

さてさて、私はちょうど私の最後のコンパイルエラーを終えた(ので、私は思った)し、これらのエラーを思い付います:

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使用して、他のクラスによって参照されている(これと間違って何を?)

他のほとんどのエラーはアレグロゲームライブラリからタイマーの静的変数と静的メソッド由来ます。

何がこれらのエラーが発生し、どのように私はそれらを取り除くのでしょうか?

事前に感謝します。

----------------編集-------------------

要求されたとして、WeaponsDB :: PIが宣言と定義されます。 これはWeaponsDB.hで宣言されます:

public:
    static double PI;

しかし、それは別のクラスDriver.cppで定義されています:

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

これは、私は、これはエラーが発生する理由を知るのが大好きだ私のコードと問題の一つである場合。

役に立ちましたか?

解決

ほとんどの場合、リンカは、あなたがそれを前に指摘したよう本当に、どこかでそれを定義するのを忘れたためにので、それがある静的メンバを検出するために失敗したときます:

// 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をマークする必要があります。静的には、それはクラスではなく、インスタンスが所有することができます。 constが、それは不変になり(とさまざまな最適化を可能にします)。

またのmath.hからM_PIを使用する代わりに定数を再検討するかもしれない。

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

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

例:Driver.cppの先頭には、必ず "の#include WeaponsDB.h" を作る表示されます。

この情報がお役に立てば幸い!

あなたはそれを関数の内部で値を代入しているように、

他の人の答えにあなたのコメントを読んでから、それが見えます。あなたが持っている必要があります:

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

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

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

静的メンバの非常に多くが欠落しています。それはあなたが一つのファイルにあなたの静的メンバの定義を集中して、あなたがそのファイルをリンクしていないということだろうか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top