Forum: Mikrocontroller und Digitale Elektronik Probleme mit Linker in WIN AVR


von Raphael (Gast)


Lesenswert?

Hallo zusammen,

ich habe ein Programm, dass aus mehreren C Dateien und einer 
Assemblerdatei besteht. Anscheinend hat der Linker ein Problem die 
Dateien zusammen zufügen. Dateien liegen alle im gleichen Ordner, 
makefile auch. Was kann das sein?

-------- begin --------
avr-gcc (GCC) 4.2.2 (WinAVR 20071221)
Copyright (C) 2007 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is 
NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR 
PURPOSE.


Compiling C: main.c
avr-gcc -c -mmcu=atmega128 -I. -gdwarf-2 -DF_CPU=8000000UL -Os 
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall 
-Wstrict-prototypes -Wa,-adhlns=./main.lst  -std=gnu99 -Wundef -MMD -MP 
-MF .dep/main.o.d main.c -o main.o

Linking: main.elf
avr-gcc -mmcu=atmega128 -I. -gdwarf-2 -DF_CPU=8000000UL -Os 
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall 
-Wstrict-prototypes -Wa,-adhlns=main.o  -std=gnu99 -Wundef -MMD -MP -MF 
.dep/main.elf.d main.o --output main.elf -Wl,-Map=main.map,--cref 
-lm
main.o: In function `main':
C:\Dokumente und Einstellungen\Raphael\Eigene Dateien\test/main.c:24: 
undefined reference to `lcd_init'
C:\Dokumente und Einstellungen\Raphael\Eigene Dateien\test/main.c:25: 
undefined reference to `backcolor'
C:\Dokumente und Einstellungen\Raphael\Eigene Dateien\test/main.c:25: 
undefined reference to `backcolor'
C:\Dokumente und Einstellungen\Raphael\Eigene Dateien\test/main.c:26: 
undefined reference to `textcolor'
C:\Dokumente und Einstellungen\Raphael\Eigene Dateien\test/main.c:26: 
undefined reference to `textcolor'
C:\Dokumente und Einstellungen\Raphael\Eigene Dateien\test/main.c:27: 
undefined reference to `fill_screen'
C:\Dokumente und Einstellungen\Raphael\Eigene Dateien\test/main.c:34: 
undefined reference to `put_char'
make.exe: *** [main.elf] Error 1

> Process Exit Code: 2
> Time Taken: 00:01

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Du verwendest Funktinen/Objekte aus anderen Modulen, ohne sie zu 
deklarieren.

Um eine Funktion/Objekt in einem anderen Modul zu verwenden, muss sie 
dort bekannt sein. Das wird in C üblicherweise über Headern erledigt.

Es fehlt in main also
1
#include "lcd-zeugs.h"
2
#include "farben-zeugs.h"
3
#include "put-zeugs.h"
4
...

Du könntest auch auf Warnungen des Compilers schauen, gib dazu mal an -W 
-Wall beim gcc-Aufruf

Johann

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Äh..Stop.-)

Wo sind denn die anderen Objekte (*.o)? Wie soll der Linker das sonst 
linken? Du gibst nur die main.o an, da sind natürlich externe Referenzen 
drinne, die der Linker nicht auflösen kann, wenn die Module fehlen, in 
denen diese definiert werden. Daher meckert er.

Ist eher ein Problem deines Linker-Aufrufs, also deines Makefiles,  als
eines des Linkers.

Johann

von ... (Gast)


Lesenswert?

@Johann:
Das ist zwar absolut richtig, würde aber auch noch nichts nützen. Wo 
sollen denn die *.o herkommen? Dazu müßte er erstmal (Zitat:)"mehreren C 
Dateien" kompilieren :)
Da fehlt also im Makefile noch mehr.

von Peter D. (pdiener) Benutzerseite


Lesenswert?

So wie das aussieht, hast du ja die Funktionen, die als undefined 
reference ausgeworfen werden, selbst geschrieben.

lcd_init
backcolor
textcolor
fill_screen
put_char

Undefined reference bedeutet, dass die Funktion an einer Stelle 
aufgerufen wird, wo sie noch nicht bekannt ist. Das kann im C-Code z.B. 
passieren, wenn man keine Prototypen angibt und Funktionen, die im 
Quelltext weiter unten definiert sind in einer Funktion, die darüber ist 
(niedrigere Zeilennummer) aufruft.

Normal macht man das dann so (Beispiel, ich kenne deine Funktionen 
nicht):
1
//define prototypes
2
void lcd_init();
3
void backcolor(int color);
4
void fill_screen(int color);
5
//usw...
6
7
8
void lcd_init()
9
{
10
  //Funktionsquelltext
11
}
12
13
void backcolor(int color)
14
{
15
  //Funktionsquelltext
16
}
17
18
void fill_screen(int color)
19
{
20
  //Funktionsquelltext
21
}

Damit darf dann auch beispielsweise innerhalb von backcolor fill_screen 
aufgerufen werden.
Wenn man das sauber machen will, packt man die ganzen Prototypen noch in 
ein Headerfile und bindet das mit #include in das main.c am Anfang ein.

Über dieses Headerfile können die Funktionen aus main.c auch anderen 
Dateien bekannt gemacht werden.

Grüße,

Peter

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.