Forum: Mikrocontroller und Digitale Elektronik Warum funktioniert es nicht.


von Thorsten (Gast)


Lesenswert?

Guten Abend Allerseits,

ich habe ein harte Nuss zu knacken ...

Mein Projekt stammt von Herrn Ulrich Radig von seiner homepage:


http://www.ulrichradig.de/home/index.php/avr/dcf77_uhr

ich habe den CPU Typ Atmega8 mit 8Mhz eingestellt
aber das Programm will einfach nicht compiliert werden.
Sieht jemand den Fehler .. ich verzweifele allmälig.

Thorsten




> "make.exe" all

-------- begin --------
avr-gcc (WinAVR 20100110) 4.3.3
Copyright (C) 2008 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=atmega8 -I. -gdwarf-2 -DF_CPU=8000000UL -Os 
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall 
-Wstrict-prototypes -Wa,-adhlns=./main.lst  -std=gnu99 -MMD -MP -MF 
.dep/main.o.d main.c -o main.o

Linking: main.elf
avr-gcc -mmcu=atmega8 -I. -gdwarf-2 -DF_CPU=8000000UL -Os 
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall 
-Wstrict-prototypes -Wa,-adhlns=main.o  -std=gnu99 -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\Thorsten\Desktop\Ulrich Radig DCF 
77\SourceCode1_6/main.c:22: undefined reference to `usart_init'
C:\Dokumente und Einstellungen\Thorsten\Desktop\Ulrich Radig DCF 
77\SourceCode1_6/main.c:28: undefined reference to `Start_Clock'
C:\Dokumente und Einstellungen\Thorsten\Desktop\Ulrich Radig DCF 
77\SourceCode1_6/main.c:30: undefined reference to `usart_write_P'
C:\Dokumente und Einstellungen\Thorsten\Desktop\Ulrich Radig DCF 
77\SourceCode1_6/main.c:35: undefined reference to `usart_write_P'
make.exe: *** [main.elf] Error 1

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

von Oliver J. (skriptkiddy)


Lesenswert?

usart.o wird nicht mit gelinkt.

Gruß Oliver

von Tim (Gast)


Lesenswert?

>aber das Programm will einfach nicht compiliert werden.

Naja, main.c wird doch fehlerfrei compiliert.
Der Linker kann einige der aufgerufenen Funktionen nicht finden:

>77\SourceCode1_6/main.c:22: undefined reference to `usart_init'
>77\SourceCode1_6/main.c:28: undefined reference to `Start_Clock'
>77\SourceCode1_6/main.c:30: undefined reference to `usart_write_P'
>77\SourceCode1_6/main.c:35: undefined reference to `usart_write_P'

>Sieht jemand den Fehler .. ich verzweifele allmälig.

In C wird jede .c Datei für sich betrachtet.
Damit man Irgendwas aus anderen .c Dateien nutzen kann
Deklariert man selbiges in .h Dateien die per #include in der .c landen.
Dadurch weiss der Compiler was es gibt und unter anderem
welche Parameter z.b. eine Funktion hat.

Erst der Linker baut aus den Einzelteilen (.o) ein ganzes (.elf).
Dir fehlt also eine .o in der die gesuchten Funktionen drin sind.
Also sag deiner Entwicklungsumgebung das sie neben main.c
noch die fehlende .c mit compilieren soll.
Die dazugehörige .h hast du ja bereits irgendwo in der main.c
per #include verbaut.

von Oliver J. (skriptkiddy)


Lesenswert?

@tim
da Dumme ist, dass im Makefile folgendes steht:
1
TARGET = main
2
SRC = $(TARGET).c clock.c usart.c
Das Projekt sollte also eigentlich ohne Probleme gebaut werden können.
Warum fehlt denn bitte bei einem "make all" usart.o?
Füttern wir gerade einen Troll?

Gruß Oliver

von Thorsten (Gast)


Lesenswert?

Hallo Guten Abend,

Tim schrieb:

> Erst der Linker baut aus den Einzelteilen (.o) ein ganzes (.elf).
> Dir fehlt also eine .o in der die gesuchten Funktionen drin sind.
> Also sag deiner Entwicklungsumgebung das sie neben main.c
> noch die fehlende .c mit compilieren soll.
> Die dazugehörige .h hast du ja bereits irgendwo in der main.c
> per #include verbaut.

und wo mache ich diese Einstellung ? im Makefile ?

Thorsten

von Hans Peter B. (Gast)


Lesenswert?

Du musst nur das Original-Makefile aus dem dcf77_uhr-Verzeichnis von 
ulrichradig.de verwenden und alle im Verzeichnis enthaltenen *.c Files 
in das gleiche Verzeichnis entpacken, dann werden alle benötigten Files 
durch die folgende Makefilezeile:

# List C source files here. (C dependencies are automatically 
generated.)

SRC = $(TARGET).c clock.c usart.c


eingebunden.

Wenn du mit dem AVR-Studio arbeitest findest auf der folgenden page ein 
Bsp.-Makefile für mehrere c-Qellfile
http://www.robotik-projekt.de/index.php/programmierung-einrichten-von-avr-studio/

Hans Peter

von ... (Gast)


Lesenswert?

Thorsten schrieb:
> ich habe ein harte Nuss zu knacken ...

Das war bei einem Blick auf den Titel des Threads schon klar
>Re: Warum funktioniert es nicht.

Bei einem so nichtssagenden Titel ist allerdings nicht verwunderlich, 
wenn da nicht allzuviele reingucken.

von Thorsten (Gast)


Lesenswert?

@Hans Peter B.

vielen Dank Hans Peter. Wie die genauen zusammenhänge mit dem Makefile
sind muss ich noch lernen. Ich bin blutiger Anfänger in C.

Ich werde mal auf dieser Seite suchen, ob jemand vieleicht eine Art Wiki
zum Thema Makefile geschrieben hat.


Jedenfalls vielen Dank !



@...

Du hast Recht mit dem Titel. Ich war Gestern nur total frustriert
das es nicht funktioniert und habe an WINAVR gezweifelt.



Thorsten

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.