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