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?
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.
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 :)
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.
> 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
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
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
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
Eine eigene Frage?
Dieser Thread ist über 16 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.