Probleme mit Linker in WIN AVR

Gast #1223238
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
Persönliche Seite #1223264
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
Persönliche Seite #1223268
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
Gast #1223285
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.
Persönliche Seite #1224607
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren