mikrocontroller.net

Forum: Compiler & IDEs Eeprom: Mehrere Strings > Linker Error


Autor: Michael Z. (incunabulum)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin!

ich versuche gerade, mehrere Strings im Eeprom zu speichern und von dort 
auf einem Display auszugeben.... Nun habe ich folgendes Problem. Mit dem 
ersten String klappt alles wie erwartet.  Will ich den zweiten String 
pcTitle2 aufrufen, so liefert mir der Linker folgenden Fehler 
(Linkeraufruf siehe unten):
main.cpp: undefined reference to `PoelControl::pcTitle2'


main.cpp
  lcdOut.writeStrgEeprom(pcTitle);
  lcdOut.writeStrgEeprom(pcTitle2);

.cpp file:
  const char EEMEM pcTitle[] = "Test\0";
  const char EEMEM pcTitle2[] = "Dummy\0";

.h file:
  const extern char EEMEM pcTitle[];
  const extern char EEMEM pcTitle2[];

Ein vertauschen der Variablendeklarationen und -definitionen führt zum 
selben Ergebnis (und nicht umgekehrt, wie ich es erwarten würde) Im 
*.map-File ist auch nur pcTitle zu finden. Definier ich die Länge der 
char-Arrays bringt dies auch nichts....Die Terminierung der Strings mit 
\0 kann ich auch weglassen. Gleiches Resultat.

Und nu? Hat jemand ne Idee, was ich da falsch mache?

cu, Michael
-------------------
Controller: AtMega32
Ide: WinAvr (current), Eclipse

Linker Aufruf:
Building target: dogDisplayCpp-I.elf
Invoking: AVR-GCC C++ Linker
avr-g++ -o  "dogDisplayCpp-I.elf"  ./main.o  ./libpoel/tools/Delay.o 
./libpoel/tools/OutputTools.o ./libpoel/tools/TimingMgr.o 
./libpoel/peripherals/Ad.o ./libpoel/peripherals/Interrupts.o 
./libpoel/peripherals/Spi.o ./libpoel/peripherals/Timer.o 
./libpoel/peripherals/Usart.o ./libpoel/peripherals/Watchdog.o 
./libpoel/drivers/DogSpi.o ./libpoel/drivers/PressSensors.o 
./libpoel/drivers/TempSensors.o  ./control/PcData.o 
./control/PcStrings.o    -lm -Wl,-Map=dogDisplayCpp-I.map --cref 
--oformat=elf32-avr -mmcu=atmega32
./main.o: In function `showIntro()':
main.cpp:(.text+0x72): undefined reference to `PoelControl::pcTitle2'
main.cpp:(.text+0x74): undefined reference to `PoelControl::pcTitle2'
make: *** [dogDisplayCpp-I.elf] Error 1
make: Target `all' not remade because of errors.
Build complete for project dogDisplayCpp-I

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Michael Z. wrote:

> .cpp file:
>   const char EEMEM pcTitle[] = "Test\0";
>   const char EEMEM pcTitle2[] = "Dummy\0";

Die \0 ist überflüssig, die ist bei C (und auch C++) implizit, wenn
man ein String-Literal schreibt.

> ./main.o: In function `showIntro()':
> main.cpp:(.text+0x72): undefined reference to `PoelControl::pcTitle2'
> main.cpp:(.text+0x74): undefined reference to `PoelControl::pcTitle2'

Die von dir dargestellten Namen lassen auf Bezeichner im global name
space schließen, die du definiert hast.  Die Referenz geht aber
offensichtlich auf einen Bezeichner, der innerhalb der Klasse
PoelControl interpretiert wird.  Irgendwas hast du da vermasselt, aber
das ist mit deinen etwas knappen Zitaten nicht herauszufinden, was es
genau ist.

Autor: Michael Z. (incunabulum)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vergesst was ich geschrieben habe....

Die Defintion + Deklration muss ohne <const> laufen. pcTitle wurde 
gefunden, da dies noch in einem anderen Header-File herum 
herumlungerte....

cu, mz

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.