LNK2001 erro e erro LNK2019 (C ++) - Solicitando algum aprendizado sobre esses erros

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

  •  22-08-2019
  •  | 
  •  

Pergunta

Tudo bem, então eu só terminei o meu último erro do compilador (assim eu pensei) e estes erros surgiu:

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

Tudo bem, aqui está uma visão geral breve.

PI é uma constante estática em WeaponsDB e é referenciada por outras classes usando WeaponsDB :: PI eo #include apropriado (o que está errado com isso?)

A maioria dos outros erros resultam de variáveis ??estáticas e métodos estáticos para temporizadores da biblioteca allegro jogos.

O que causa esses erros e como eu pode se livrar deles?

Agradecemos antecipadamente

---------------- edições -------------------

Conforme solicitado, onde o WeaponsDB :: PI é declarada e definida. É declarado em WeaponsDB.h:

public:
    static double PI;

Mas ela é definida em outra classe Driver.cpp:

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

Se este é um dos problemas com meu código que eu gostaria de saber por que isso causa um erro.

Foi útil?

Solução

Na maioria das vezes, quando o vinculador não está a detectar um membro estático é porque você se esqueceu de realmente defini-la em algum lugar, como foi apontado anteriormente:

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

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

Mas no seu caso, como você não está faltando apenas variáveis ??estáticas, mas também todo o resto dos membros da minha aposta é que você não está ligando o arquivo de implementação (s) (CPP) em seu projeto. Você deve fornecer uma unidade de compilação que define os símbolos que foram declarados no cabeçalho, e fazer a compilação ambiente e vinculá-lo juntos. Se os símbolos pertencem a uma unidade de compilação de uma biblioteca externa (a partir de seu projeto atual), então você deve se lembrar de ligação com a biblioteca.

Outras dicas

Este

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

atribui um valor a PI. Ele não cria espaço para ele (não defini-lo).

Isso cria espaço para (define) PI e atribui um valor para (inicializa)-lo.

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

Você deve provavelmente também PI marca como "const estático" e não apenas "estática". estática torna propriedade da classe em vez de pela instância. const torna imutável (e permite várias otimizações).

Você também pode considerar o uso M_PI de math.h em vez de recriar a constante.

Editar : parenthetically aditados os termos mais precisos:. Define, inicializa devido ao comentário de WP

Declarando uma variável em um só lugar e atribuindo-lhe um valor em outro lugar não deve causar erros. Certifique-se de incluir WeaponsDB.h no topo de todos os arquivos que objetos de referência definido lá.

Ex: no topo da Driver.cpp, certifique-se aparece "#include WeaponsDB.h"

.

Espero que isso ajude!

A partir da leitura seus comentários nas respostas de outras pessoas, parece que você está atribuindo-lhe um valor dentro de uma função. Você precisa ter:

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

.. em um escopo global (ou seja, não dentro de uma função) do seu arquivo de implementação, presumivelmente WeaponsDB.cpp. E, nesse caso, "const" ing seria apropriado. Na verdade, você pode pular a parte sobre colocando-a no CPP e apenas fazê-lo diretamente no WeaponsDB.h:

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

Uma enorme quantidade de membros estáticos estão faltando. Será que você se concentrar suas definições de membros estáticos em um arquivo, e então você não vincular esse arquivo em?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top