Hallo! ich bin gerade mit WinAVR am Verzweifeln. Mein C-Programm für einen Mega8535 mit mehreren Modulen hat sich bisher immer einwandfrei kompilieren und linken lassen; jetzt habe ich das Makefile, die c- und h-Dateien in ein neues Verzeichnis kopiert (s-, d-Dateien sind nicht mehr vorhanden), der Linker bringt mir jetzt die Meldung: crtm8535.o(.init9+0x0): undefined reference to `main' die Flags im Makefile sehen so aus: # Optional compiler flags. CFLAGS = -g -O$(OPT) -funsigned-char -funsigned-bitfields -fpack-struct \ -fshort-enums -Wall -Wstrict-prototypes -Wa,-ahlms=$(<:.c=.lst) # Optional assembler flags. ASFLAGS = -Wa,-ahlms=$(<:.s=.lst), -gstabs # Optional linker flags. LDFLAGS = -Wl,-Map=$(TARGET).map,--cref # Additional library flags (-lm = math library). LIBFLAGS = -lm die main.c so: #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <inttypes.h> #include <stdio.h> #include "globdef.h" #include "irgr.h" #include "rs232mng.h" #include "mixer.h" #include "info.h" #include "main.h" int main (void) { MIXER mix; // RS232-Initialisierung, stdio-Zuweisung RS232Init (RS232_ADS_38_4); fdevopen (RS232Send, RS232Receive, 0); ....... und die main.h: #ifndef _MAIN_H_ #define _MAIN_H_ // --- Prototypen --- /* extern */ int main (void); #endif ich hab's auch mit extern vor den Prototypen in den Headerdateien probiert, hat leider nichts geholfen. Kann mir jemand helfen? Danke! Philipp
Ist ja schön, daß Du ein main.c hast, aber Du mußt es beim Linken auch berücksichtigen. Wenn Du mit den Makefiles nicht klarkommst, hier meine übliche Eigenwerbung für Mfile: http://www.sax.de/~joerg/mfile/ Btw: #ifndef _MAIN_H_ Please don't do this. Bezeichner, die mit Unterstrichen beginnen, sind (kurz gesagt) für normale Applikationen unzulässig. Nenne das MAIN_H, und gut is'. Davon abgesehen, main() muß man nicht als Prototyp exportieren, falls Du nicht gerade vor hast, main() selbst innerhalb der Applikation rekursiv aufzurufen.
Hallo, die Module stehen schon alle im Makefile: # List C source files here. (C dependencies are automatically generated.) SRC = main.c irgr.c rs232mng.c tdamng.c mixer.c ansi.c info.c i2cmng.c \ , die o-Dateien werden alle brav erzeugt (also auch main.o), danach will der Linker aber main nicht mehr finden. Könnte das ein Bug von WinAVR (Build 20030913) sein?
Nein, es ist in jedem Falle ein Bug in Deinem Makefile. WinAVR installiert ohnehin nur ein Beispiel-Makefile. Wie geschrieben, wenn Du mit make nicht klarkommst, weil Dir das Verfolgen, wer wann wo welchen Makro setzt und dann benutzt zu aufwendig ist, greif zu Mfile. Genau dafür habe ich es doch geschrieben.
@Jörg: Du hast in Deinem make Template der Linux-Version noch einen kleinen Fehler in der Linker-Sektion: "#LDMAP = $(LDFLAGS) -Wl,-Map=$(TARGET).map,--cref LDFLAGS = $(EXTMEMOPTS) $(LDMAP) $(PRINTF_LIB) $(SCANF_LIB) $(MATH_LIB)" Das beisst sich, vielleicht änderst Du das noch ;)
Hallo Jörg, Danke für die Hilfe! Jetzt geht es; den gcc mit den zusätzlichen Generate Dependency-Flags versorgt (kopiert aus dem mit mfile erzeugten Makefile), und der Linker arbeitet ohne Probleme. Was teilt der Compiler dem Linker mit den Dependency-Files eigentlich genau mit? Gruss, Philipp
Sorry, hab mir die Antwort gerade selber gegeben. Nochmal Danke @ Jörg! Philipp
@Holger: Ja, danke. Da es in einem Kommentar steht, war's noch nicht aufgefallen. Diese rekursiven Make-Makros waren mal ein großer Denkfehler von mir... ;-) Damit wollte ich die eleganten FOO += mumble Konstrukte auflösen, da SysV make die nicht versteht. Habe eben nur in dem Moment überhaupt nicht dran gedacht, daß make natürlich alle Makros erst am Ende bewertet...
hallo leute, ich kriege das gleiche fehler wie bei phillip.Ich arbeite gerade im windows und benutze GNU make (make.exe) mit avr-gcc Der linker bringt mir die folgende meldung: crtm128.o(.init9+0x0): undefined reference to `main' und habe auch versuchtmit der linkerflags zu manipulieren..aber hat nihts gebracht. wenn jemand mir helfen kann, wäre das super danke gandhi
avr-gcc systimer.o lcd.o sta013.o uart.o i2c.o spi.o ata_if.o playmgr.o
procyon.o -Wl,-Map=procyon.map,--cref -mmcu=atmega128 -o procyon.elf
C:\WinAVR\bin\..\lib\gcc-lib\avr\3.3.1\..\..\..\..\avr\lib\avr5\crtm128.
o(.init9+0x0):
undefined reference to `main'
avr-objcopy -O avrobj procyon.elf procyon.obj
avr-objcopy: procyon.elf: No such file or directory
avr-objcopy -O ihex procyon.elf procyon.rom
avr-objcopy: procyon.elf: No such file or directory
avr-objcopy -j .eeprom --set-section-flags=.eeprom="alloc,load" -O
ihex procyon.elf procyon.eep
avr-objcopy: procyon.elf: No such file or directory
>Exit code: 0
das ist mein makefile output ,er erzeugt die objekt dateien einwandfrei
aber kann er nur der int main(void) in procyon.c erkennen.
kann der jörg mir noch helfen???? :(
danke :)
gandhi
> kann der jörg mir noch helfen???? :(
Nein, ich kann dir dein main() schlecht schreiben, das musst
du schon selbst tun...
ich hab schon ein main() das er nur nicht erkennt. gandhi
Dann hast du halt die Datei nicht im Makefile angegeben, in der das main() drin steht. Sorry, meine Kristallkugel ist in der Reparatur, daher kann ich von hier aus den Inhalt deiner Festplatte leider nicht einsehen.
wenn du mein sourcecodes und makefile meinst , dann hab ich das auch in meine obigen antworten angehängt.
Hmm, sorry, das hatte ich nicht bemerkt. Anyway, tut mir leid, diese Procyon-Makefile-Templates kann und will ich nicht verstehen. Mfile mag ich nach bestem Wissen und Gewissen supporten, aber für diese Makefiles musst du dich bitte an deren Autor wenden. Ich kann sie bei mir nichtmal testen. Ich mag auch die Eigenwilligkeiten von Pascal Stang nicht supporten, dass er statt des vorgeschriebenen #include <avr/io.h> zu #include <io.h> mutiert und dann erwartet, dass der Compiler das via -I auf der Kommandozeile findet. (Die Variante <avr/io.h> findet er ohne jegliche -I-Optionen.) Selbst wenn ich das lokal noch hacke, erbricht er sich dann an offensichtlich fehlenden Definitionen von u08 etc. Tut mir leid, too many errors.
ahh kein problem.....ich versuchs trotzdem.hab noch zeit bis zum donnerstag :) danke ciao
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.