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


von Amir (Gast)


Angehängte Dateien:

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!

von Karl H. (kbuchegg)


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



von Amir B. (sticky)


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?


von Karl H. (kbuchegg)


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.

von Amir B. (sticky)


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.

von Amir B. (sticky)


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

von Karl H. (kbuchegg)


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


von Karl H. (kbuchegg)


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

von Amir B. (sticky)


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

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
Noch kein Account? Hier anmelden.