Frage

In Ordnung, so beendete ich gerade meinen letzten Compiler-Fehler (so dachte ich) und diese Fehler kam:

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

In Ordnung, hier eine kurze Übersicht.

PI ist eine statische Konstante in WeaponsDB und wird von anderen Klassen verweist mit WeaponsDB :: PI und die entsprechende # include (was mit diesem falsch?)

Die meisten anderen Fehler ergeben sich aus statischen Variablen und statischen Methoden für Timer aus der allegro-Gaming-Bibliothek.

Was sind die Ursachen dieser Fehler und wie könnte ich sie loswerden?

Vielen Dank im Voraus

---------------- Edits -------------------

Wie gewünscht, wo die WeaponsDB :: PI deklariert und definiert. Es wird in WeaponsDB.h erklärt:

public:
    static double PI;

Aber es ist in einer anderen Klasse Driver.cpp definiert:

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

Wenn dies ist eines der Probleme mit meinem Code würde ich weiß, lieben, warum dies einen Fehler verursacht.

War es hilfreich?

Lösung

Meistens, wenn der Linker versagt ein statisches Element zu erkennen, ist es, weil Sie wirklich vergessen, es irgendwo zu definieren, wie es vorher hingewiesen wurde:

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

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

Aber in Ihrem Fall, da Sie nicht nur statische Variablen fehlen, sondern auch alle übrigen Mitglieder meine Wette ist, dass Sie nicht die Implementierungsdatei verknüpfen (n) (CPP) in Ihrem Projekt. Sie müssen eine Übersetzungseinheit bereitzustellen, die die Symbole definiert, die im Header deklariert wurden, und die Umwelt Kompilierung machen und miteinander verknüpfen. Wenn die Symbole auf eine Übersetzungseinheit in einer externen Bibliothek (aus Ihrem aktuellen Projekt) gehören, dann müssen Sie daran denken, mit der Bibliothek zu verknüpfen.

Andere Tipps

Das

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

ordnet einen Wert PI. Es schafft nicht Platz für sie (es nicht definieren).

Dies schafft Raum für (definiert) PI und weist einen Wert () Initialisiert es.

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

Sie sollten wahrscheinlich markieren auch PI als „static const“ und nicht nur „statisch“. statisch macht es von der Klasse im Besitz statt von der Instanz. const macht es unveränderlich (und ermöglicht verschiedene Optimierungen).

Sie könnten auch erwägen M_PI aus math.h statt Neuerstellung der Konstante verwendet wird.

Bearbeiten : parenthetisch die präziseren Begriffe hinzugefügt:. Definiert, initialisiert aufgrund WP Kommentars

Deklarieren eine Variable in einem Ort und ihm einen Wert an einem anderen Ort zuweisen darf keine Fehler verursachen. Stellen Sie sicher, dass Sie WeaponsDB.h an der Spitze aller Dateien enthalten, die Objekte dort definiert verweisen.

Bsp.: An der Spitze der Driver.cpp, stellen Sie sicher, dass "# include WeaponsDB.h" erscheint

Hope, das hilft!

Von Ihren Kommentare in anderen Leuten Antworten zu lesen, es sieht aus wie Sie ihm einen Wert innerhalb einer Funktion zuweisen. Sie müssen haben:

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

.. in einem globalen Rahmen (dh nicht innerhalb einer Funktion) Ihre Implementierungsdatei, vermutlich WeaponsDB.cpp. Und in diesem Fall „const“ ing es angemessen wäre. In der Tat kann man den Teil überspringt darüber in Ihrer CPP setzen und tut es einfach direkt in WeaponsDB.h:

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

Sehr viele statische Elemente fehlen. Könnte es sein, dass Sie Ihre statischen Mitglieder Definitionen in einer Datei konzentrieren, und dann verbinden Sie diese Datei nicht in?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top