Error LNK2001 y LNK2019 de error (C ++) - Solicitud de un cierto aprendizaje sobre estos errores

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

  •  22-08-2019
  •  | 
  •  

Pregunta

Muy bien, así que acaba de terminar mi último error del compilador (así que pensé) y estos errores se acercó:

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

Muy bien, he aquí una breve descripción.

pi es una constante estática en WeaponsDB y se hace referencia por otras clases utilizando WeaponsDB :: PI y el # include apropiado (lo que está mal con esto?)

La mayoría de los otros errores que se derivan de las variables estáticas y métodos estáticos para contadores de tiempo de la biblioteca Allegro juego.

Lo que hace que estos errores y cómo podría yo deshacerse de ellos?

Gracias de antemano

Las ediciones ---------------- -------------------

Según lo solicitado, en el que el WeaponsDB :: PI se declara y define. Se declara en WeaponsDB.h:

public:
    static double PI;

Pero se define en otra clase Driver.cpp:

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

Si este es uno de los problemas con mi código me gustaría saber por qué esto provoca un error.

¿Fue útil?

Solución

Muy a menudo, cuando el conector está fallando para detectar un miembro estático es debido a que se olvidó de definir realmente en algún lugar, como se señaló antes:

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

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

Sin embargo, en su caso, ya que no sólo se echa en falta las variables estáticas, sino también todo el resto de los miembros de mi apuesta es que no se está vinculando el archivo de implementación (s) (.cpp) en su proyecto. Debe proporcionar una unidad de compilación que define los símbolos que fueron declarados en la cabecera, y hacer que el entorno de compilación y vincularlo juntos. Si los símbolos pertenecen a una unidad de compilación de una biblioteca externa (de su proyecto actual), entonces usted debe recordar para enlazar con la biblioteca.

Otros consejos

Este

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

asigna un valor a PI. No crea espacio para ello (no definirlo).

Esto crea espacio para (define) PI y asigna un valor a (inicializa) de ella.

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

Debería probablemente marcar PI como "static const" y no sólo "estática". estática hace que sea propiedad de la clase en lugar de por la instancia. const hace que sea inmutable (y permite varias optimizaciones).

También puede considerar el uso de M_PI math.h lugar de volver a la constante.

Editar : añade entre paréntesis los términos más precisos:. Define, inicializa debido al comentario de WP

Al declarar una variable en un lugar y asignándole un valor en otro lugar no debería causar ningún error. Asegúrese de incluir WeaponsDB.h en la parte superior de todos los archivos que hacen referencia a objetos definidos allí.

Ex.: En la parte superior de Driver.cpp, asegúrese de que "WeaponsDB.h # include" aparece

Espero que esto ayude!

A partir de la lectura de sus comentarios en las respuestas de otras personas, parece que va a asignar un valor dentro de una función. Es necesario tener:

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

.. en un ámbito global (es decir, no dentro de una función) de su archivo de aplicación, presumiblemente WeaponsDB.cpp. Y en ese caso, "const" ing sería apropiado. De hecho, se puede omitir la parte en ponerlo en su .cpp y simplemente hacerlo directamente en WeaponsDB.h:

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

Una gran cantidad de miembros estáticos faltan. Podría ser que usted concentra sus miembros definiciones estáticas en un archivo, y luego no vincula ese archivo en?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top