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
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
Ä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
@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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.