www.mikrocontroller.net

Forum: Compiler & IDEs WinAVR - undefined reference to 'main'


Autor: Philipp Sibler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Philipp Sibler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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 ;)

Autor: Philipp Sibler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Philipp Sibler (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, hab mir die Antwort gerade selber gegeben.

Nochmal Danke @ Jörg!

Philipp

Autor: Jörg Wunsch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@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...

Autor: adil gandhi (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: adil gandhi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> kann der jörg mir noch helfen???? :(

Nein, ich kann dir dein main() schlecht schreiben, das musst
du schon selbst tun...

Autor: adil gandhi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab schon ein main() das er nur  nicht erkennt.

gandhi

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: adil gandhi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
wenn du mein sourcecodes und makefile meinst , dann hab ich das auch in
meine obigen antworten angehängt.

Autor: adil gandhi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und der int main(void) liegt in procyon.c :)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: adil gandhi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ahh kein problem.....ich versuchs trotzdem.hab noch zeit bis zum
donnerstag :)
danke
ciao

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.