errore LNK2001 e LNK2019 errore (C ++) - Richiesta di un po 'di apprendimento di questi errori

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

  •  22-08-2019
  •  | 
  •  

Domanda

Va bene, così ho appena finito il mio ultimo errore del compilatore (così ho pensato) e questi errori si avvicinò:

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

Bene, ecco una breve panoramica.

PI è una costante statica in WeaponsDB e viene fatto riferimento da altre classi che utilizzano WeaponsDB :: PI e il # include appropriata (cosa c'è di sbagliato in questo?)

La maggior parte degli altri errori derivano da variabili statiche e metodi statici per i timer dalla libreria allegro gioco.

Quali sono le cause di questi errori e come potrebbe io sbarazzarsi di loro?

Grazie in anticipo

---------------- modifiche -------------------

Come richiesto, dove il WeaponsDB :: PI è dichiarata e definita. Si è dichiarata in WeaponsDB.h:

public:
    static double PI;

Ma è definito in un'altra classe Driver.cpp:

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

Se questo è uno dei problemi con il mio codice mi piacerebbe sapere perché questo causa un errore.

È stato utile?

Soluzione

Il più delle volte, quando il linker non riesce a rilevare un membro statico è perché a dimenticato di definire davvero da qualche parte, come è stato sottolineato in precedenza:

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

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

Ma nel tuo caso, come si è non solo mancano le variabili statiche, ma anche tutto il resto dei membri mia scommessa è che non si collega il file di implementazione (s) (cpp) nel progetto. È necessario fornire un'unità di compilazione che definisce i simboli che sono stati dichiarati nell'intestazione, e rendere la compilazione ambiente e collegare insieme. Se i simboli appartengono a un'unità di compilazione in una libreria esterna (dal progetto in corso) allora si deve ricordare di collegare con la libreria.

Altri suggerimenti

Questo

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

assegna un valore a PI. Non crea spazio per esso (non la definisce).

Questo crea spazio per (definisce) PI e assegna un valore (inizializza) esso.

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

Probabilmente si dovrebbe contrassegnare anche PI come "static const" e non solo "statica". statica rende di proprietà della classe invece del dall'istanza. const rende immutabile (e consente varie ottimizzazioni).

Si potrebbe anche considerare l'utilizzo di M_PI da math.h invece di ricreare la costante.

Modifica : tra parentesi aggiunti i termini più precisi:. Definisce, inizializza a causa di commento di WP

La dichiarazione di una variabile in un posto e l'assegnazione di un valore in un altro posto non dovrebbe causare gli eventuali errori. Assicurati di includere WeaponsDB.h in cima a tutti i file che fanno riferimento a oggetti definiti là.

Es.: Nella parte superiore del Driver.cpp, assicurarsi che "# include WeaponsDB.h" appare

Spero che questo aiuti!

Da leggere i vostri commenti in risposte di altre persone, sembra che si sta assegnando un valore all'interno di una funzione. È necessario disporre di:

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

.. in un ambito globale (cioè non all'interno di una funzione) del file di implementazione, presumibilmente WeaponsDB.cpp. E in quel caso, "const" ing sarebbe opportuno. In realtà, è possibile saltare la parte di mettere nel vostro cpp e giusto farlo direttamente in WeaponsDB.h:

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

Un sacco di membri statici sono mancanti. Potrebbe essere che ti concentri vostri membri definizioni statiche in un file, e quindi non si collega il file in?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top