Erreur LNK2001 et LNK2019 d'erreur (C ++) - Demander un apprentissage sur ces erreurs

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

  •  22-08-2019
  •  | 
  •  

Question

D'accord, donc je viens de terminer ma dernière erreur du compilateur (donc je pensais) et ces erreurs est venu:

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

D'accord, voici un bref aperçu.

PI est une constante statique dans WeaponsDB et est référencé par d'autres classes à l'aide WeaponsDB :: PI et le #include approprié (ce qui ne va pas avec ça?)

La plupart des autres erreurs proviennent de variables statiques et des méthodes statiques pour les minuteries de la bibliothèque de jeux allegro.

Quelles sont les causes de ces erreurs et comment pourrait-je me débarrasser d'eux?

Merci d'avance

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

Comme l'avait demandé, où le WeaponsDB :: PI est déclarée et définie. Il est déclaré dans WeaponsDB.h:

public:
    static double PI;

Mais il est défini dans une autre classe Driver.cpp:

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

Si c'est l'un des problèmes avec mon code que j'aimerais savoir pourquoi cela provoque une erreur.

Était-ce utile?

La solution

Le plus souvent, lorsque l'éditeur de liens ne parvient pas à détecter un membre statique, il est parce que vous avez oublié de définir vraiment quelque part, comme il a été souligné avant:

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

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

Mais dans votre cas, que vous ne manquent pas que les variables statiques, mais aussi tout le reste des membres de mon pari est que vous n'êtes pas liez le fichier de mise en œuvre (s) (Cpp) dans votre projet. Vous devez fournir une unité de compilation qui définit les symboles qui ont été déclarés dans l'en-tête, et de faire la compilation de l'environnement et le lier ensemble. Si les symboles appartiennent à une unité de compilation dans une bibliothèque externe (de votre projet en cours), vous devez vous rappeler de lien avec la bibliothèque.

Autres conseils

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

attribue une valeur à PI. Il ne crée pas d'espace pour elle (ne définit pas).

Cela crée un espace pour (définit) PI et attribue une valeur à (Initialise) il.

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

Vous devez marquer probablement PI comme « const statique » et non seulement « statique ». statique rend appartient à la classe plutôt que par l'instance. const rend immuable (et permet diverses optimisations).

Vous pouvez également envisager d'utiliser M_PI de math.h au lieu de recréer la constante.

Modifier : les termes ajouté entre parenthèses plus précis:. Définit, en raison du initialise commentaire WP

Déclarer une variable dans un seul endroit et en lui attribuant une valeur dans un autre lieu ne devrait pas causer d'erreurs. Assurez-vous d'inclure WeaponsDB.h en haut de tous les fichiers qui font référence à des objets qui y sont définis.

Ex.: En haut de Driver.cpp, assurez-vous "WeaponsDB.h #include" apparaît

Hope this helps!

De la lecture de vos commentaires dans les réponses des autres, il semble que vous attribuez une valeur à l'intérieur d'une fonction. Vous devez avoir:

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

.. dans une portée globale (ce qui signifie pas à l'intérieur d'une fonction) de votre dossier de mise en œuvre, WeaponsDB.cpp probablement. Et dans ce cas, « const » ing il serait approprié. En fait, vous pouvez sauter la partie à mettre dans votre Cpp et le faire directement dans WeaponsDB.h:

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

Un très grand nombre de membres statiques sont manquants. Serait-ce que vous vous concentrez vos définitions membres statiques dans un seul fichier, et vous ne liez pas ce fichier dans?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top