Forum: Compiler & IDEs avr-gcc mit eclipse wirft mit Fehlern nach mir


von Jan (Gast)


Lesenswert?

Hallo Leute,

ich bin recht neu im µC Bereich, habe mir nach dem aktuellen Tutorial 
auch mein Eclipse mit dem AVr Plugin eingerichtet, passt auch alles 
soweit.

Wenn ich jetzt allerdings Peter Fleurys Library Kompillieren will, incl 
dem Beispiel bekomme ich folgenden Fehler:

**** Build of configuration Debug for project SCAR ****

make all
Building file: ../main.c
Invoking: AVR Compiler
avr-gcc -Wall -g2 -gstabs -O0 -fpack-struct -fshort-enums 
-funsigned-char -funsigned-bitfields -mmcu=atmega16 -DF_CPU=16000000UL 
-MMD -MP -MF"main.d" -MT"main.d" -c -o"main.o" "../main.c"
Finished building: ../main.c

Building file: ../uart.c
Invoking: AVR Compiler
avr-gcc -Wall -g2 -gstabs -O0 -fpack-struct -fshort-enums 
-funsigned-char -funsigned-bitfields -mmcu=atmega16 -DF_CPU=16000000UL 
-MMD -MP -MF"uart.d" -MT"uart.d" -c -o"uart.o" "../uart.c"
Finished building: ../uart.c

Building target: SCAR.elf
Invoking: AVR C Linker
avr-gcc -Wl,-Map,SCAR.map -mmcu=atmega16 -o"SCAR.elf"  ./main.o ./uart.o
./uart.o: In function `__vector_11':
../uart.c:248: multiple definition of `__vector_11'
./main.o:../uart.c:248: first defined here
./uart.o: In function `__vector_12':
../uart.c:291: multiple definition of `__vector_12'
./main.o:../uart.c:291: first defined here
./uart.o: In function `uart_init':
../uart.c:315: multiple definition of `uart_init'
./main.o:../uart.c:315: first defined here
./uart.o: In function `uart_getc':
../uart.c:393: multiple definition of `uart_getc'
./main.o:../uart.c:393: first defined here
./uart.o: In function `uart_putc':
../uart.c:421: multiple definition of `uart_putc'
./main.o:../uart.c:421: first defined here
./uart.o: In function `uart_puts':
../uart.c:447: multiple definition of `uart_puts'
./main.o:../uart.c:447: first defined here
./uart.o: In function `uart_puts_p':
../uart.c:461: multiple definition of `uart_puts_p'
./main.o:../uart.c:461: first defined here
make: *** [SCAR.elf] Fehler 1

Ich habe jeweils nur eine uart.c, uart.h, main.c (die ehemals 
test_usrt.h hieß).
Was spielt da verrückt?

von P. S. (Gast)


Lesenswert?


von Jan (Gast)


Lesenswert?

Hab ich nicht drin!

Zumindest wüsste ich nicht, wo eine zweite definition beim kopieren des 
Quelltextes herkommen sollte.

von Jan (Gast)


Lesenswert?

Okay, ich weiß nun wieso, bzw kanns mir vorstellen!

Eclipse kompilliert alle Dateien und linkt sie dann.

Ich habe mit meinen drei Befehlen nicht gelinkt, sondern direkt 
eingebunden.

Könnte das die Lösung sein?

Wenn ja, dann habe ich einen #include in eclipse zu viel drinne, weil 
das ding dann included wird UND nochmal versucht zu linken.

von Peter (Gast)


Lesenswert?

kann es sein das du irgendwelche *.c dateien per include einbindest?

von Jan (Gast)


Lesenswert?

Ja, das war der Fall, als ich manuell kompilliert habe.

Die UART Library besteht aus 3 Dateien: uart.h, uart.c und test_uart.c. 
in die test_uart.c habe ich die uart.c zusätzlich zur uart.h 
eingebunden. Das hat dann in der IDE zu Fehlern geführt.

Nun habe ich das Include rausgenommen und es wird perfekt gelinkt.


Danke :)

von Peter (Gast)


Lesenswert?

Jan schrieb:
> Ja, das war der Fall, als ich manuell kompilliert habe.

das liegt aber nicht an der IDE, sondern daran das man NIE c Datein per 
include einbindet.

von I. L. (Gast)


Lesenswert?

> das liegt aber nicht an der IDE, sondern daran das man NIE c Datein per
> include einbindet.

Wie bindet man sonst *.c Dateien ein?
Ich hab z.B.:
1
#include <avr/interrupt.h>
2
#include <stdio.h>
3
#include <avr/io.h>
4
#include <util/delay.h>
5
#include <string.h>
6
#define SYSCLK 16000000                    
7
#include "uart.c"

mit Programmers Notepad programmiert, ohne Probleme.

Mit Eclipsse scheint sowas nicht zu gehen?
Wie binde ich denn dann den Inhalt der *.c Dateien ein?


Gruß Knut

von ... .. (docean) Benutzerseite


Lesenswert?

warum zum kuckuck willst du das machen?

Der C Gott hat .h Dateien erfunden, dann nutze diese auch!!!

von Oliver (Gast)


Lesenswert?

Ingo L. schrieb:
...
> #include "uart.c"
> mit Programmers Notepad programmiert, ohne Probleme.

Du programmierst mit Programmers Notepad? Eher nicht. PN ist ein Editor, 
mehr nicht. Compilieren tut dahinter WinAVR, genauer ein Compiler und 
ein Linker, gesteuert von einem makefile.

In das makefile schreibt man hinein, welche .c-Files alle zum Projekt 
gehören, und der Linker baut die dann zusammen.

> Mit Eclipsse scheint sowas nicht zu gehen?
> Wie binde ich denn dann den Inhalt der *.c Dateien ein?

Mit Eclipse geht das ganz genauso. Nur nimmt dir das sogar noch die 
Arbeit ab, das makefile zu erstellen, das geht da ganz automatisch.

Du musst lediglich alle .c-File dem Projektordner hinzufügen.

Oliver

von Knut (Gast)


Lesenswert?

Sorry wenn ich zu doof bin, wenn ich meine uart. c in das 
projektverzeichnis
packe erkennt der kopiler das nicht. Die ganzen Direktiven wie zb PORTA 
werden nicht mehr
erkannt obwohl die Datei Links im Suchbaum auftaucht? Was mache ich 
falsch
beim Einbinden? Wozu überhaupt ".c Files einbinden? Kann man das nicht 
Header Dateien
stopfen? Ich bin noch nicht so sehr erfahren und sammel noch Erfahrungen


Gruß Knut

von Oiver (Gast)


Lesenswert?

Jede .c-Datei wird einzeln kompiliert, also müssen auch in jeder 
.c-Daten alle benötigten .h-Dateien inkludiert werden. Wenn in uart.c 
zb. PORTA nicht erkannt wird, bedeutet das, daß die Datei kompiliert 
werden soll, dort aber das #include <avr/io.h> fehlt.

Oliver

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.