"We are back" « oc.at

c++: undefined reference bei static member variablen

wergor 26.02.2016 - 23:06 3120 7
Posts

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4111
beim kompilieren des folgenden codes gibt der compiler warnings aus:
Code: CPP
#include <DueFlashStorage.h>

class EEPROMHandler
{
  public:
  EEPROMHandler();
  ~EEPROMHandler();
  
  static void read(uint8_t address, byte& content)
  {    
      content = dfs_.read(address);
  }

  static void write(uint8_t address, byte content)
  {
        dfs_.write(address, content);
  }

private:
  static DueFlashStorage dfs_;
};

EEPROMHandler eepromHandler;

void setup() {
  // put your setup code here, to run once:
  eepromHandler.write(0, 1);
}

void loop() {
  // put your main code here, to run repeatedly:
  byte a;
  eepromHandler.read(0, a);

  Serial.println(a);

  while(1);
}
Zitat
sketch\DueFlashStorageUndefinedReferenceTest.ino.cpp.o: In function `EEPROMHandler::write(unsigned char, unsigned char)':

C:\Users\wergor\Documents\Arduino\DueFlashStorageUndefinedReferenceTest/DueFlashStorageUndefinedReferenceTest.ino:16: warning: undefined reference to `EEPROMHandler::dfs_'

sketch\DueFlashStorageUndefinedReferenceTest.ino.cpp.o: In function `loop':

C:\Users\wergor\Documents\Arduino\DueFlashStorageUndefinedReferenceTest/DueFlashStorageUndefinedReferenceTest.ino:35: warning: undefined reference to `EEPROMHandler::dfs_'

sketch\DueFlashStorageUndefinedReferenceTest.ino.cpp.o: In function `__static_initialization_and_destruction_0':

C:\Users\wergor\Documents\Arduino\DueFlashStorageUndefinedReferenceTest/DueFlashStorageUndefinedReferenceTest.ino:23: warning: undefined reference to `EEPROMHandler::EEPROMHandler()'

C:\Users\wergor\Documents\Arduino\DueFlashStorageUndefinedReferenceTest/DueFlashStorageUndefinedReferenceTest.ino:23: warning: undefined reference to `EEPROMHandler::~EEPROMHandler()'
ich komme nicht drauf woran das liegt. in anderen klassen habe ich auch static members, aber nur in dieser klasse gibt es die warnings beim kompilieren.
Bearbeitet von JC am 27.02.2016, 11:15

murcielago

Dr. Doom
Avatar
Registered: Oct 2002
Location: *
Posts: 2692
weil sie nicht initalisiert werden...

PuhBär

Schau ned so genau
Avatar
Registered: Sep 2002
Location: .
Posts: 1240
Constructor und Destructor sind deklariert aber nicht implementiert. Entweder gleich löschen aus der Klassendefinition, oder bei neueren Compiler "= default" am Ende schreiben, um anzugeben, dass du die Defaultimplementierung willst (die auch erstellt wird wenn du sie nicht explizit deklarierst).

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4111
Zitat von murcielago
weil sie nicht initalisiert werden...
was meinst du genau?
Zitat von PuhBär
Constructor und Destructor sind deklariert aber nicht implementiert. Entweder gleich löschen aus der Klassendefinition, oder bei neueren Compiler "= default" am Ende schreiben, um anzugeben, dass du die Defaultimplementierung willst (die auch erstellt wird wenn du sie nicht explizit deklarierst).
in der klasse die ich tatsächlich benutze sind constructor und destructor implementiert (mir ist gar nicht aufgefallen dass für die auch warnings gemeldet wurden).

mit ging es eigentlich um die zeilen
Zitat
sketch\DueFlashStorageUndefinedReferenceTest.ino.cpp.o: In function `EEPROMHandler::write(unsigned char, unsigned char)':

C:\Users\wergor\Documents\Arduino\DueFlashStorageUndefinedReferenceTest/DueFlashStorageUndefinedReferenceTest.ino:16: warning: undefined reference to `EEPROMHandler::dfs_'

sketch\DueFlashStorageUndefinedReferenceTest.ino.cpp.o: In function `loop':

C:\Users\wergor\Documents\Arduino\DueFlashStorageUndefinedReferenceTest/DueFlashStorageUndefinedReferenceTest.ino:35: warning: undefined reference to `EEPROMHandler::dfs_

that

Hoffnungsloser Optimist
Avatar
Registered: Mar 2000
Location: MeidLing
Posts: 11342
Dir fehlt ein

Code: CPP
DueFlashStorage EEPROMHandler::dfs_;

damit es die Variable auch wirklich gibt.

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4111
Zitat von that
Dir fehlt ein

Code: CPP
DueFlashStorage EEPROMHandler::dfs_;

damit es die Variable auch wirklich gibt.
wo gehört das hin?
edit: habs gefunden. danke! jetzt checke ich auch murcielago's post :D
Bearbeitet von wergor am 27.02.2016, 10:58

murcielago

Dr. Doom
Avatar
Registered: Oct 2002
Location: *
Posts: 2692
ja sorry, um die zeit war ich nicht mehr so ausgiebig in meiner antwort :D

wergor

connoisseur de mimi
Avatar
Registered: Jul 2005
Location: vulkanland
Posts: 4111
Zitat von murcielago
ja sorry, um die zeit war ich nicht mehr so ausgiebig in meiner antwort :D
macht nix ;)
mich wundert nur dass ich früher noch nie über dieses problem gestolpert bin.
Kontakt | Unser Forum | Über overclockers.at | Impressum | Datenschutz