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
@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
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.
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.