www.mikrocontroller.net

Forum: Compiler & IDEs WinAvr: Testprogramm compilieren schlägt fehl


Autor: Amir (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo an alle.
Ich versuche einen Atwega48 zu programmieren und wollte erst mal die 
compilierchain mittels eines Testprogs zu durchlaufen, welches ich
aus dem Tutorial habe.

#include <avr/io.h>          // (1)

int main (void) {            // (2)

   DDRB  = 0xff;             // (3)
   PORTB = 0x03;             // (4)

   while(1) {                // (5a)
     /* "leere" Schleife*/;  // (5b)
   }                         // (5c)

   /* wird nie erreicht */
   return 0;                 // (6)
}



Ich erhalte jedoch folgenden Kompilierfhler.

------------------------------------------------------------------------ 
--
> "make.exe" all

Compiling C: test.c
avr-gcc -c -mmcu=atmega48 -I. -gdwarf-2 -DF_CPU=8000000UL -O0 
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall 
-Wstrict-prototypes -Wa,-adhlns=./test.lst  -std=gnu99 -Wundef -MMD -MP 
-MF .dep/test.o.d test.c -o test.o

Compiling C: ../test1/test.c
avr-gcc -c -mmcu=atmega48 -I. -gdwarf-2 -DF_CPU=8000000UL -O0 
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall 
-Wstrict-prototypes -Wa,-adhlns=./../test1/test.lst  -std=gnu99 -Wundef 
-MMD -MP -MF .dep/test.o.d ../test1/test.c -o ../test1/test.o

Linking: test.elf
avr-gcc -mmcu=atmega48 -I. -gdwarf-2 -DF_CPU=8000000UL -O0 
-funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall 
-Wstrict-prototypes -Wa,-adhlns=test.o  -std=gnu99 -Wundef -MMD -MP -MF 
.dep/test.elf.d test.o ../test1/test.o --output test.elf 
-Wl,-Map=test.map,--cref     -lm
../test1/test.o: In function `main':
../test1/test.c:7: multiple definition of `main'
test.o:../test1/test.c:7: first defined here
make.exe: *** [test.elf] Error 1

> Process Exit Code: 2
> Time Taken: 00:10

------------------------------------------------------------------------ 
--

Die Makefile ist im gleichen Verzeichnis wie das c-prog.

nutze winavr20070525

Ich bitte um Hilfe.
Danke im Voraus!

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Compiling C: test.c
> ...
> Compiling C: ../test1/test.c

Du hast 2 Files im makefile eingetragen
Einmal das test.c auf dem aktuellen Verzeichnis und
ein zweitesmal die Datei ../test1/test.c

Und ich rate jetzt mal ins Blaue hinein:
In beiden Files gibt es jeweils eine Funktion main()



Autor: Amir B-a (sticky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
----------------------------------------------------
Du hast 2 Files im makefile eingetragen
Einmal das test.c auf dem aktuellen Verzeichnis und
ein zweitesmal die Datei ../test1/test.c
-----------------------------------------------------

das was du meinst ist aber 2 mal die gleiche datei




Im makefile soll doch einmal der dateiname ohne endung (TARGET = test) 
und einmal die datei inklusive pfadangegeben (SRC = $(TARGET).c 
../test1/test.c) angegeben werden, so wie ich das verstanden habe.
und diese ist jewils test.c

und wenn ich eins von beiden nicht eintrage, tauchen wieder kompilier 
fehler auf?


Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Amir B-a wrote:
> ----------------------------------------------------
> Du hast 2 Files im makefile eingetragen
> Einmal das test.c auf dem aktuellen Verzeichnis und
> ein zweitesmal die Datei ../test1/test.c
> -----------------------------------------------------
>
> das was du meinst ist aber 2 mal die gleiche datei

Das ist wurscht, denn im Linker

> avr-gcc -mmcu=atmega48 -I. -gdwarf-2 -DF_CPU=8000000UL -O0
> -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall
> -Wstrict-prototypes -Wa,-adhlns=test.o  -std=gnu99 -Wundef -MMD -MP -MF
> .dep/test.elf.d test.o ../test1/test.o --output test.elf

                  ****** ***************

taucht dann 2 mal die gleiche Datei auf, was mit Sicherheit
Probleme geben wird.

Du musst an deinem Makefile arbeiten.

> Im makefile soll doch einmal der dateiname ohne endung (TARGET = test)
> und einmal die datei inklusive pfadangegeben (SRC = $(TARGET).c
> ../test1/test.c) angegeben werden, so wie ich das verstanden habe.

Das $(TARGET).c  ist doch schon die Datei. TARGET ist ein
Platzhalter und expandiert zu test. Damit steht dann da

SRC = test.c ../test1/test.c

und somit hast du 2 Source code files angegeben. Du brauchst aber
nur eines.

An der SRC Vorgabe brauchst du dich nur vergreifen, wenn dein
komplettes Projekt aus mehr als einem *.c File besteht. Ansonsten
lässt man die in Ruhe.

Autor: Amir B-a (sticky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
OK ich hab den Fehler gefunden:

im Makefile muss das $target weg  bei
SRC = $(TARGET).c../test1/test.c

bzw wenn mann die c/c++ source file angibt das häckschen bei include weg 
machen.

danke karl.

Autor: Amir B-a (sticky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> An der SRC Vorgabe brauchst du dich nur vergreifen, wenn dein
> komplettes Projekt aus mehr als einem *.c File besteht. Ansonsten
> lässt man die in Ruhe.

ohne der src vorgabe geht es aber auch nicht!

aber jetzt läufts ja danke noch mal

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Amir B-a wrote:
> OK ich hab den Fehler gefunden:
>
> im Makefile muss das $target weg  bei
> SRC = $(TARGET).c../test1/test.c

Das ist nicht so schlau.

SRC = $(TARGET).c

wäre besser


Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Amir B-a wrote:
>> An der SRC Vorgabe brauchst du dich nur vergreifen, wenn dein
>> komplettes Projekt aus mehr als einem *.c File besteht. Ansonsten
>> lässt man die in Ruhe.
>
> ohne der src vorgabe geht es aber auch nicht!

Ich sag ja nicht, dass du sie komplett rausnehmen sollst.

SRC = $(TARGET).c

So stands ursprünglich mal drinn. Und wenn man nur 1 *.c
hat, gibt es keinen Grund daran was zu ändern

Autor: Amir B-a (sticky)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja ist einleuchtend.

mach ich ab jetzt auch so.

sehe aber gerdae das das makefile es sowieso durch SRC = $(TARGET).c 
ersetzt hat.

Danke nochmal :-)

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.