Forum: Compiler & IDEs Avr-gcc will nicht mit include-Dateien


von Heiko B. (heiko_b)


Angehängte Dateien:

Lesenswert?

Guten Morgen
Bislang habe ich mit der AVR-Toolchain gearbeitet. Auf Win 8.1 läuft die 
ja leider nicht mehr. Darum habe ich mich umgesehen und "Prebuilt GNU 
toolchain for avr" von "http://gnutoolchains.com/avr/"; installiert.
Das ergibt avr-gcc5.3.0.exe

Die beigefügten Beispiele kann ich ohne Fehlermeldungen compilieren. Am 
Ende steht eine .hex-Datei im Verzeichnis.

Folgendes Programm kann ich nicht übersetzten

#include <avr/io.h>
#include "uart.h" //<-Das ist die Library von Peter Fleury

int main (void)
{
uart_putc(0x00);
    return (0);
}

uart.c und uart.h liegen im gleichen Verzeichnis wie main.c
Das Makefile ist von den Beispielen kopiert und nur leicht angepaßt. 
(PRG, OBJ, Target und weiter unten
dependency:
main.o: uart.h uart.c

Ich bekomme dann die berühmte Fehlermeldung:

> "make" all
avr-gcc -g -Wall -O2 -mmcu=atmega16    -c -o main.o main.c
avr-gcc -g -Wall -O2 -mmcu=atmega16  -Wl,-Map,main.map -o main.elf 
main.o
main.o: In function `main':
C:\Heiko\C\Minitest/main.c:8: undefined reference to `uart_putc'
collect2.exe: error: ld returned 1 exit status
"make": *** [main.elf] Error 1

> Process Exit Code: 2

Im Verzeichnis existieren anschließend zusätzlich nur die main.o und 
main.map

Eine uart.o fehlt

Aber warum?
Das Makefile befindet sich im Anhang

Es ist bestimmt nur eine Kleinigkeit :-) Ich war bislang immer ganz 
froh, dass es klaglos funktioniert hat und ich nicht in die Untiefen der 
Toolchain eintauchen musste.
Bei meinen alten Makefiles gab es immer die Variable SRC mit den 
entsprechenden Einträgen. Hier nur die dependency. Ich vermute der 
Fehler kommt aus der Ecke, aber die alten Makefiles wollen auch nicht.

Vielleich kann mir ja jemand das Brett vom Kopf nehmen, oder es ergibt 
sich ein Anhaltspunkt, an dem ich weiterforschen kann.

Noch einen schönen Sonntag
Heiko

von Thomas M. (thomil)


Lesenswert?

Du musst einfach die uart.o bei den Objects eintragen:

> OBJ            = main.o uart.o

von --- (Gast)


Lesenswert?

> #include "uart.h" //<-Das ist die Library von Peter Fleury

Bei Antuino womöglich.
Das ist ein Header- aka Includefile.

Und: Das wird auch nicht gelinkt. Gelinkt wird main.o und uart.o.


> ich nicht in die Untiefen der Toolchain eintauchen musste

Wer den elementaren Umgang mit Compiler, Preprozessor und Linker
geistig ignorieren will, sollte sich einem Haekelkreis anschliessen.

von Heiko B. (heiko_b)


Lesenswert?

@ Thomas Miletich:
Hurra! Das wars. Es ist so wie ich dachte. Man sieht den Wald vor lauter 
Bäumen nicht :-) Ich war sicher, hätte es ausprobiert. -Egal-
Endlich bekomme ich andere Fehlermeldungen ...
Liegt aber daran, daß die Library noch SIGNAL benutzt, aber das ist 
Fleißarbeit.

Also: Danke!

: Bearbeitet durch User
von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Heiko B. schrieb:
> Liegt aber daran, daß die Library ...

Es ist keine. Du verwendest keine Library. Du verwendest einfach nur 
ein zweites Sourcefile mit zugehörigem Headerfile.

Nenn' so etwas nicht Library.

Eine Library ist eine Sammlung von bereits compiliertem Code, der bei 
gcc & Co. in einer *.a-Datei zu finden ist (deren Name obendrein mit 
"lib" anfängt).

Wenn Du eine Datei namens "libuart.a" verwenden würdest, dann würdest 
Du eine Library verwenden.

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.