Forum: Compiler & IDEs undefined reference to 'main'


von Julian Schietinger (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen.
bin gerade dabei einen ATMega8 zu programmieren. Nur leider kann ich 
mein Programm nicht kompilieren. es kommt immer die Fehlermeldung: 
"../../../../../avr-libc-1.4.6/crt1/gcrt1.S:51: undefined reference to 
`main'"

Ich habe im Forum etliche beiträge zu dieser oder ähnlicher 
Fehlermeldung gefunden doch keine Lösung hat bei mir geholfen.

habe Das main.c Programm und die Makefile angehängt.
Makefile wurde mit mfile von WinAVR erstellt.

Beide sind unter C:\AVRProgrammierung\ gespeichert also ohne leerzeichen 
im Pfad.

die eingebundenen headerdateien *.h sind alle im selben ordner wie das 
Programm gespeichert.

main.c und Makefile sind auch im selben ordner.

Wer kann mich dabei helfen?

wozu brauch ich denn eigentlich die ganzen dateien die der Compiler 
dabei erstellen will. z.B. *.elf.....

Bin um jede Antwort zur möglichen Lösung des Problems dankbar.

Vielen Dank im Vorraus.

Gruß Julian

von Uwe .. (uwegw)


Lesenswert?

Änder mal im makefile den Abschnitt
# List C source files here. (C dependencies are automatically 
generated.)
SRC =

auf
SRC = $(TARGET).c

Damit wird deine main.c zur Liste der zu übersetzenden Dateien 
hinzugefügt. Das ist in meinen makefiles (die auch nur diversen Vorlagen 
entnommen sind) immer enthalten. Lasse ich es weg, kann ich deinen 
Fehler reproduzieren.

Die vielen Dateien, die der Compiler neben dem hex produziert, sind 
diverse Zwischenschritte auf dem Weg zum hex.
Die .elf kann man zb nutzen, um das Programm im AVRstudio zu simulieren.
Die .lst enthält das Assemblierte Programm, man kann dort also 
nachverfolgen, wie der Compiler bestimmte Sachen übersetzt hat.

von Julian Schietinger (Gast)


Lesenswert?

Danke Uwe.
Hat funktioniert.
Jetzt kommen alle Syntaxfehler/Fehler die drin sind.
kannst du mir da auch weiter helfen?

main.c:17:19: error: sleep.h: No such file or directory
main.c:23:23: error: "(" may not appear in macro parameter list
main.c:34: warning: return type of 'main' is not 'int'
main.c: In function 'main':
main.c:38: error: 'BAUD_PRESCALE' undeclared (first use in this 
function)
main.c:38: error: (Each undeclared identifier is reported only once
main.c:38: error: for each function it appears in.)
main.c:45: error: expected expression before 'void'
main.c:45: error: too many arguments to function 'initUSART'
main.c:46: error: expected expression before 'void'
main.c:46: error: too many arguments to function 'initADC'
main.c:50: warning: implicit declaration of function 'trans_TXData'
main.c:50: error: expected expression before 'int'
main.c:54: warning: implicit declaration of function 'set_sleep_mode'
main.c:54: error: 'SLEEP_MODE_PWR_DOWN' undeclared (first use in this 
function)
main.c:55: warning: implicit declaration of function 'sleep_mode'
main.c: In function 'initUSART':
main.c:75: error: 'UCSRZ0' undeclared (first use in this function)
main.c: At top level:
main.c:115: warning: conflicting types for 'trans_TXData'
main.c:50: warning: previous implicit declaration of 'trans_TXData' was 
here
main.c:119:2: warning: no newline at end of file
make.exe: *** [main.o] Error 1

Danke im Vorraus.
Gruß Julian

von Karl H. (kbuchegg)


Lesenswert?

Julian Schietinger wrote:
> Danke Uwe.
> Hat funktioniert.
> Jetzt kommen alle Syntaxfehler/Fehler die drin sind.
> kannst du mir da auch weiter helfen?

Geh sie der Reihe nach durch.
Interessant sind immer nur die ersten 2 oder 3 Fehlermeldungen.
Die restlichen könnten einfach nur Folgefehler sein.

> main.c:17:19: error: sleep.h: No such file or directory

Ist ja wohl ziemlich eindeutig.
Es gibt keine Datei namens "sleep.h" die includiert
werden könnte. Das mag vielleicht daran liegen, dass
die mitgelieferte sleep.h auf dem Subverzeichnis avr
liegt.

Es muss also

#include <avr/sleep.h>

heissen.
Reserviere übrigens bei der Angabe von #include Files, die
" für deine eigenen Dateien und benutze für Systemfiles die
einschliesung in < >


> main.c:23:23: error: "(" may not appear in macro parameter list

Das liegt daran, dass hier

#define BAUD_PRESCALE(((F_CPU/(USART_BAUDRATE*16UL)))-1)
                     ^
                     |

ein Leerzeichen stehen muss. Ansonsten würde der Präprozessor
den Klammerausdruck als Makro Argument auffassen. Und das kann
in diesem Fall nicht das gewünschte sein. Es ist relativ klar, dass
der Klammerausdruck als Ersetzungstext gedacht ist (und die
Einklammerung ist durchaus lobenswert)

#define BAUD_PRESCALE (((F_CPU/(USART_BAUDRATE*16UL)))-1)

Jetzt ist das für den Präprozessor die Anweisung überall
dort, wo im Quelltext BAUD_PRESCALE vorkommt, diesen Text
durch den Text (((F_CPU/(USART_BAUDRATE*16UL)))-1) zu
ersetzen.


> main.c:34: warning: return type of 'main' is not 'int'

Das sollte eigentlich eindeutig sein

> main.c: In function 'main':
> main.c:38: error: 'BAUD_PRESCALE' undeclared (first use in this
> function)

Ist auch klar. BAUD_PRESCALE hat oben einen Fehler hervorgerufen.
Damit wurde es nicht definiert und der Präprozessor hat die
Ersetzung nicht vorgenommen.

Spätestens jetzt ist es an der Zeit, die bisher gefundenen Fehler
zu korrigieren und neu zu compilieren. Dadurch sollten schon
mal einige (nicht alle) Fehler verschwunden sein.

Die restlichen Fehler gehst du wieder durch. Die ersten 2 oder
3 Fehler korrigieren und neu kompilieren.

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.