Forum: Compiler & IDEs Code Blocks - undefined reference to __eerd_byte_m168
Hallo,
ich weiß nicht ob ich hier im richtigen Forum bin, aber meine (leider
erfolglosen) Recherchen zu diesem Problem haben einige Beiträge im
Unterforum GCC angezeigt.
Mein Problem:
Ich möchte den angehängten Code mit Code:Blocks (Nightly Build 7789) +
WinAVR-20100110 compilieren, erhalte aber folgende Fehlermeldungen im
Build log bzw in den Build Messages.
Build log 1 | -------------- Build: Release in AVRIS ---------------
| 2 |
| 3 | Compiling: main.c
| 4 | Linking native: bin\Release\AVRIS.elf
| 5 | obj\Release\main.o: In function `main':
| 6 | main.c:(.text+0x22): undefined reference to `__eerd_byte_m168'
| 7 | main.c:(.text+0x1ca): undefined reference to `__eerd_byte_m168'
| 8 | main.c:(.text+0x1da): undefined reference to `__eewr_byte_m168'
| 9 | Process terminated with status 1 (0 minutes, 0 seconds)
| 10 | 3 errors, 0 warnings (0 minutes, 0 seconds)
|
Build Messages 1 | obj\Release\main.o||In function `main':|
| 2 | main.c:(.text+0x22)||undefined reference to `__eerd_byte_m168'|
| 3 | main.c:(.text+0x1ca)||undefined reference to `__eerd_byte_m168'|
| 4 | main.c:(.text+0x1da)||undefined reference to `__eewr_byte_m168'|
| 5 | ||=== Build finished: 3 errors, 0 warnings (0 minutes, 0 seconds) ===|
|
Ich hab jetzt bereits ein paar Stunden erfolglos gegoogelt und irgendwie
keine Lösung für dieses Problem gefunden. Einige Threads hier und da
besagen, dass sich die eeprom.h stark geändert hat und das libc.o nicht
zusammenpasst oder so. Das alles sagt mir also Compiler/IDE Noob
überhaupt nichts. Es bietet sich mir aus diesen Antworten kein
Lösungsansatz, da ich die hinterlegte Technik und das Zusammenspiel
zwischen Compiler, Linker und Tüdelüt nicht verstehe.
Kann mir jemand weiterhelfen?
Gruß,
Florian
Versuch mal
>> Tüdelüt -mmcu=atmega168
anstatt
>> Tüdelüt
Wenn das nicht hilft: poste die Optionen, mit denen Tüdelüt und Täterä
aufgerufen werden.
Ich nehme an du meinst das, was sich in Code:Blocks Compiler Flags
nennt.
So wie es aussieht nur:
Optimize generated code (for size) [Os]
und
ATmega168 [-mmcu=atmega168]
Fehlermeldung ist bleibt gleich, egal ob ATmega168 [-mmcu=atmega168]
angeklickt ist oder nicht.
Gruß,
Florian
Florian R. schrieb:
> Ich nehme an du meinst das, was sich in Code:Blocks Compiler Flags
> nennt.
Nein.
Das, was Compiler, Linker, Assembler etc. an Optionen erhalten.
Das ist jeweils eine Zeile an Text.
Wie auch immer die GUI oder IDE oder make oder wer auch immer diesen
Aufruf zusammenbasteln ist egal. Was zählt, ist das Resultat.
Irdendwo/wie muss sich das doch anzeigen lassen?
Okay ich hab jetzt folgendes eingestellt:
Unter Settings -> Compiler and debugger -> Global compiler settins ->
Reiter "Other Settings" -> Compiler Logging auf Full Command Line
Jetzt steht im Buildlog folgendes: 1 | -------------- Build: Release in AVRIS ---------------
| 2 |
| 3 | avr-g++.exe -LC:\C_Programming\AVRIS\ -LC:\WinAVR-20100110\avr\lib -o bin\Release\AVRIS.elf obj\Release\main.o obj\Release\fuse.o -mmcu=atmega168 -Wl,-Map=bin\Release\AVRIS.map,--cref
| 4 | obj\Release\main.o: In function `main':
| 5 | main.c:(.text+0x22): undefined reference to `__eerd_byte_m168'
| 6 | main.c:(.text+0x1ca): undefined reference to `__eerd_byte_m168'
| 7 | main.c:(.text+0x1da): undefined reference to `__eewr_byte_m168'
| 8 | Process terminated with status 1 (0 minutes, 0 seconds)
| 9 | 3 errors, 0 warnings (0 minutes, 0 seconds)
|
Hoffe das ist die von dir gewünschte Information.
Gruß,
Florian
Florian R. schrieb:
> -LC:\WinAVR-20100110\avr\lib
Lass das weg. Demit überschreibst du den (richtigen) Libpfad der Tools.
Wenn du ins erzeugte Map reinschaust siehst du, daß die falsche
Bibliotheksversion verwendet wird. Die richtige für ATmeha168 ist avr5.
> -LC:\C_Programming\AVRIS\
Wozu brauchst das? D.h. welche (nicht gelinkten) Libs flottieren dort
rum?
Danke, es geht jetzt. (Nach Entfernen des Pfads
C:\WinAVR-20100110\avr\lib).
1 | -------------- Build: Release in AVRIS ---------------
| 2 |
| 3 | avr-gcc.exe -Wall -mmcu=atmega168 -DF_CPU=16000000UL -mmcu=atmega168 -Os -Os -IC:\C_Programming\AVRIS\ -c main.c -o obj\Release\main.o
| 4 | avr-g++.exe -LC:\C_Programming\AVRIS\ -o bin\Release\AVRIS.elf obj\Release\fuse.o obj\Release\main.o -mmcu=atmega168 -Wl,-Map=bin\Release\AVRIS.map,--cref
| 5 | Output size is 3.30 KB
| 6 | Running project post-build steps
| 7 | cmd /c "avr-objdump -h -S bin\Release\AVRIS.elf > bin\Release\AVRIS.lss"
| 8 | avr-objcopy -R .eeprom -R .fuse -R .lock -R .signature -O ihex bin\Release\AVRIS.elf bin\Release\AVRIS.hex
| 9 | avr-objcopy --no-change-warnings -j .eeprom --change-section-lma .eeprom=0 -O ihex bin\Release\AVRIS.elf bin\Release\AVRIS.eep
| 10 | avr-objcopy --no-change-warnings -j .lock --change-section-lma .lock=0 -O ihex bin\Release\AVRIS.elf bin\Release\AVRIS.lock
| 11 | avr-objcopy --no-change-warnings -j .signature --change-section-lma .signature=0 -O ihex bin\Release\AVRIS.elf bin\Release\AVRIS.sig
| 12 | avr-objcopy --no-change-warnings -j .fuse --change-section-lma .fuse=0 -O ihex bin\Release\AVRIS.elf bin\Release\AVRIS.fuse
| 13 | srec_cat bin\Release\AVRIS.fuse -Intel -crop 0x00 0x01 -offset 0x00 -O bin\Release\AVRIS.lfs -Intel
| 14 | srec_cat bin\Release\AVRIS.fuse -Intel -crop 0x01 0x02 -offset -0x01 -O bin\Release\AVRIS.hfs -Intel
| 15 | srec_cat bin\Release\AVRIS.fuse -Intel -crop 0x02 0x03 -offset -0x02 -O bin\Release\AVRIS.efs -Intel
| 16 | Process terminated with status 0 (0 minutes, 1 seconds)
| 17 | 0 errors, 0 warnings (0 minutes, 1 seconds)
|
Ich glaub den Pfad hatte ich mal eingestellt, weil ich rumgetestet habe
wie ich meine eigene .h-Datei einbinden kann. Kann aber auch default
gewesen sein, weiß ich nicht mehr so genau.
Mittlerweile hab ich es hinbekommen die .h-Datei einzubinden, aber ich
finde es unheimlich unintuitiv, dass wenn ich im Projektverzeichnis eine
.h-Datei anlege und diese in den Project-Baum mit aufnehme, dass diese
dann nicht ohne weitere Pfadeinstellungen (Search Directories) gleich
mit includiert werden kann.
Ich hab's aus Frust zwischenzeitlich mal mit Eclipse + AVR Plugin
probiert, aber da hat er dann schon die Standard includes (z.B.
avr/io.h) nicht mehr finden können. Die Pfadeinstellungen waren für mich
als Vollnoob gefühlt zehnfach so komplex ein zu stellen.
Aber vielleicht bin ich mit dieser Meinung ja ganz alleine und sollte
lieber mal den Peter Nuhr machen. :)
In C:\C_Programming\AVRIS\ liegt die von mir selbst angelegte
danni_debounce.h. Auf den enthaltenen Code habe ich keinen Anspruch. Der
ist natürlich von Peter).
Danke nochmal für die Hilfe.
//EDIT:
Jo, man kann den C-Code auch direkt im Arduino-IDE compilieren,
allerdings scheint die Arduino-IDE keine Kommentare oder excessive
Leerzeichen-Orgien (wie sie manchmal zur Textformatierung ja ganz
nützlich sind) in mehrzeiligen Makros zu mögen. Da regnet es auf jeden
Fall hunderte von Fehlermeldungen.
Wenn der Makro-Code so: 1 | /**************************************/
| 2 | /* Not so powerful Debouncing Example */
| 3 | /* No Interrupt needed */
| 4 | /* Author: Peter Dannegger */
| 5 | /**************************************/
| 6 | #define debounce(port,pin)({\
| 7 | static uint8_t flag = 0;\
| 8 | uint8_t i = 0;\
| 9 | if( flag )\
| 10 | {\
| 11 | while(1)\
| 12 | {\
| 13 | if( !(port & 1<<pin) )\
| 14 | {\
| 15 | i = 0;\
| 16 | break;\
| 17 | }\
| 18 | _delay_us( 98 );\
| 19 | if( --i == 0 )\
| 20 | {\
| 21 | flag = 0;\
| 22 | i = 0;\
| 23 | break;\
| 24 | }\
| 25 | }\
| 26 | }\
| 27 | else\
| 28 | {\
| 29 | while(1)\
| 30 | {\
| 31 | if( (port & 1<<pin) )\
| 32 | {\
| 33 | i = 0;\
| 34 | break;\
| 35 | }\
| 36 | _delay_us( 98 );\
| 37 | if( --i == 0 )\
| 38 | {\
| 39 | flag = 1;\
| 40 | i = 1;\
| 41 | break;\
| 42 | }\
| 43 | }\
| 44 | }\
| 45 | i;\
| 46 | })
|
formatiert ist, geht es allerdings.
Florian R. schrieb:
> Ich glaub den Pfad hatte ich mal eingestellt, weil ich rumgetestet habe
> wie ich meine eigene .h-Datei einbinden kann. Kann aber auch default
> gewesen sein, weiß ich nicht mehr so genau.
>
> Mittlerweile hab ich es hinbekommen die .h-Datei einzubinden, aber ich
> finde es unheimlich unintuitiv, dass wenn ich im Projektverzeichnis eine
> .h-Datei anlege und diese in den Project-Baum mit aufnehme, dass diese
> dann nicht ohne weitere Pfadeinstellungen (Search Directories) gleich
> mit includiert werden kann.
Weil: #include <danni_debounce.h>
Anstatt: #include "danni_debounce.h"
danni_debounce.h ist kein Systemheader wie math.h
> Jo, man kann den C-Code auch direkt im Arduino-IDE compilieren,
> allerdings scheint die Arduino-IDE keine Kommentare oder excessive
> Leerzeichen-Orgien (wie sie manchmal zur Textformatierung ja ganz
> nützlich sind) in mehrzeiligen Makros zu mögen. Da regnet es auf jeden
> Fall hunderte von Fehlermeldungen.
Wenn es nur ein // Kommentar bis zum Zeilenende ist, ist das auch
richtig so
> Wenn der Makro-Code so:
ogottogottogott
Das so als Makr reinzukloppen damit fängst du dir nur Probleme ein!
Warum? ZB fehlende Klammern um die Parameter, etc.
mach das als inline-Funktion. Ist zudem lesbarer und portabler da kein
GNU-C erforderlich ist.
Das Makro kommst aus diesem Artikel:
http://www.mikrocontroller.net/articles/Entprellung#Debounce-Makro_von_Peter_Dannegger
Vorher hatte ich noch nie mit Makros zu tun. Inline Funktionen musste
ich bisher auch noch nie verwenden, aber ich hab bisher halt auch nur so
den normalen C Anfänger kram für die Kommandozeile programmiert.
Die Begründung warum das ganze als Makro realisiert wurde (in Peters
Thread im Artikel) erschien mir irgendwie einleuchtend, von daher habe
ich das nicht hinterfragt und einfach Stumpf übernommen.
Gruß,
Florian
//Edit, okay hab mal ein bischen über Inline Funktionen gelesen, scheint
mir der bessere weg zu sein, ich werds mal ausprobieren ob ich das
hinbekomme.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
|