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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Philipp Sibler (Gast)


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

von Jörg Wunsch (Gast)


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.

von Philipp Sibler (Gast)


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?

von Jörg Wunsch (Gast)


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.

von Holger (Gast)


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 ;)

von Philipp Sibler (Gast)


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

von Philipp Sibler (Gast)


Lesenswert?

Sorry, hab mir die Antwort gerade selber gegeben.

Nochmal Danke @ Jörg!

Philipp

von Jörg Wunsch (Gast)


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

von adil gandhi (Gast)


Angehängte Dateien:

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

von adil gandhi (Gast)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

> kann der jörg mir noch helfen???? :(

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

von adil gandhi (Gast)


Lesenswert?

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

gandhi

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von adil gandhi (Gast)


Lesenswert?

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

von adil gandhi (Gast)


Lesenswert?

und der int main(void) liegt in procyon.c :)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von adil gandhi (Gast)


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]
  • [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.