Guten Abend! Ich habe vor geraumer Zeit auf AVR Studio 6.1 umgestellt. Jetzt habe ich ein Programm am Wickel, welches unter 5 bereits einmal lief, welches mir aber nun mit boshafter Konstanz mitteilt, dass es die UART Bibliothek von Peter Fleury nicht mehr findet. Und zwar behauptet der Rechner: Error 1 undefined reference to `uart_init(unsigned int)' D:\Dokumente\Dokumente\Projekte\Partyraumlampen\Probe\UART Probe\UART Probe\Debug/.././UART Probe.cpp 43 1 UART Probe Diese Fehlermeldung taucht zu allen UART Befehlen auf! Um alle möglichen eigenen Fehler auszuschließen habe ich die Originalversion vom Peter geladen, ohne jeglichen Erfolg! Kann einer von Euch helfen?
ArduStemmi schrieb: > Um alle möglichen eigenen Fehler auszuschließen habe ich die > Originalversion vom Peter geladen, ohne jeglichen Erfolg! hast du sei auch in das projekt eingebunden?
Lerne Fehlermeldungen Deines Entwicklungswerkzeugs verstehen. "undefined reference" ist eine Linkerfehlermeldung. Du hast die nötige *.h-Datei eingebunden, aber nicht die nötige *.c-Datei zu Deinem Projekt/Deinem Makefile hinzugefügt.
Riecht danach, dass die UART.h und .c nicht im Projekt sind und Vorallem die UART.h nicht included ist, wo die Routinen verwendet werden.
Hier der originale Ausschnitt aus der Datei vom Peter: /*********************************************************************** ** Title: example program for the Interrupt controlled UART library Author: Peter Fleury <pfleury@gmx.ch> http://jump.to/fleury File: $Id: test_uart.c,v 1.5 2012/09/14 17:59:08 peter Exp $ Software: AVR-GCC 3.4, AVRlibc 1.4 Hardware: any AVR with built-in UART, tested on AT90S8515 at 4 Mhz DESCRIPTION: This example shows how to use the UART library uart.c ************************************************************************ */ #include <stdlib.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/pgmspace.h> #include "uart.h" /* define CPU frequency in Mhz here if not defined in Makefile */ #ifndef F_CPU #define F_CPU 16000000UL #endif /* 9600 baud */ #define UART_BAUD_RATE 9600 int main(void) { Die UART.h ist definitiv included! Die uart.h und die uart.c befinden sich beide im gleichen Verzeichnis wie die main.c Deshalb bin ich ja so verzweifelt!
>Die UART.h ist definitiv included! Das reicht nicht. >Die uart.h und die uart.c befinden sich beide im gleichen Verzeichnis >wie die main.c Auch das reicht nicht. Füge uart.c zu deinem Projekt hinzu. Sonst wird es nicht kompiliert und du hast deine "undefined reference".
Bernhard Schröcker schrieb: > Riecht danach, dass die UART.h und .c nicht im Projekt sind und Vorallem > die UART.h nicht included ist, wo die Routinen verwendet werden. falsch, denn sonst würde der Compiler meckern und nicht der linker
ArduStemmi schrieb: > Die uart.h und die uart.c befinden sich beide im gleichen Verzeichnis > wie die main.c > > Deshalb bin ich ja so verzweifelt! Aber dem Projekt und der IDE nicht bekannt. Deshalb wird die .c Datei nicht kompiliert und später beim Linken nicht hinzugelinkt. Eclipse CDT verhält sich da anders, da wird einfach alles kompiliert und zusammengelinkt was zufällig so im Projektordner herumliegt, nicht so bei Atmelstudio 6.
:
Bearbeitet durch User
@Holger: Was heißt: Füge die uart.c Deinem Projekt hinzu? Gibt es noch eine Möglichkeit, die ich im Moment übersehe?
ArduStemmi schrieb: > @Holger: Was heißt: Füge die uart.c Deinem Projekt hinzu? Gibt es noch > eine Möglichkeit, die ich im Moment übersehe? hier beschreibt es gerade jemand: Beitrag "Einbinden von Header und Source Files"
Ja, das war ich! Wenn das so wie ich es da beschrieben habe richtig ist, dann geht es nicht!
ArduStemmi schrieb: > Ja, das war ich! Wenn das so wie ich es da beschrieben habe richtig ist, > dann geht es nicht! zeige uns mal ein bei screenshots. Und die Ausgabe vom Buildprozess.
>Ja, das war ich! Wenn das so wie ich es da beschrieben habe richtig ist, >dann geht es nicht! Was geht dann nicht? Bekommst du Errors? Kompiliert es nicht? Schieb dein Projekt mal komplett hier rüber.
------ Build started: Project: UART Probe, Configuration: Debug AVR ------ Build started. Project "UART Probe.cppproj" (default targets): Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!=''). Target "CoreBuild" in file "C:\Program Files (x86)\Atmel\Atmel Studio 6.1\Vs\Compiler.targets" from project "D:\Dokumente\Dokumente\Projekte\Partyraumlampen\Probe\UART Probe\UART Probe\UART Probe.cppproj" (target "Build" depends on it): Using "RunCompilerTask" task from assembly "C:\Program Files (x86)\Atmel\Atmel Studio 6.1\Extensions\Application\AvrGCC.dll". Task "RunCompilerTask" C:\Program Files (x86)\Atmel\Atmel Studio 6.1\shellUtils\make.exe all Building file: .././UART Probe.cpp Invoking: AVR8/GNU C Compiler : 3.4.2 "C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.2.1002\avr8-gnu-toolchain\bin\avr-g++.exe" -funsigned-char -funsigned-bitfields -DDEBUG -O1 -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -g2 -Wall -mmcu=atmega328p -c -MD -MP -MF "UART Probe.d" -MT"UART Probe.d" -MT"UART Probe.o" -o "UART Probe.o" ".././UART Probe.cpp" Finished building: .././UART Probe.cpp Building file: .././uart.c Invoking: AVR8/GNU C Compiler : 3.4.2 "C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.2.1002\avr8-gnu-toolchain\bin\avr-gcc.exe" -funsigned-char -funsigned-bitfields -DDEBUG -O1 -ffunction-sections -fdata-sections -fpack-struct -fshort-enums -g2 -Wall -mmcu=atmega328p -c -std=gnu99 -MD -MP -MF "uart.d" -MT"uart.d" -MT"uart.o" -o "uart.o" ".././uart.c" Finished building: .././uart.c Building target: UART Probe.elf Invoking: AVR8/GNU Linker : 3.4.2 "C:\Program Files (x86)\Atmel\Atmel Toolchain\AVR8 GCC\Native\3.4.2.1002\avr8-gnu-toolchain\bin\avr-g++.exe" -o "UART Probe.elf" "UART Probe.o" uart.o -Wl,-Map="UART Probe.map" -Wl,--start-group -Wl,-lm -Wl,--end-group -Wl,--gc-sections -mmcu=atmega328p UART Probe.o: In function `main': D:\Dokumente\Dokumente\Projekte\Partyraumlampen\Probe\UART Probe\UART Probe\Debug/.././UART Probe.cpp(43,1): undefined reference to `uart_init(unsigned int)' D:\Dokumente\Dokumente\Projekte\Partyraumlampen\Probe\UART Probe\UART Probe\Debug/.././UART Probe.cpp(57,1): undefined reference to `uart_puts(char const*)' D:\Dokumente\Dokumente\Projekte\Partyraumlampen\Probe\UART Probe\UART Probe\Debug/.././UART Probe.cpp(62,1): undefined reference to `uart_puts_p(char const*)' D:\Dokumente\Dokumente\Projekte\Partyraumlampen\Probe\UART Probe\UART Probe\Debug/.././UART Probe.cpp(70,1): undefined reference to `uart_puts(char const*)' D:\Dokumente\Dokumente\Projekte\Partyraumlampen\Probe\UART Probe\UART Probe\Debug/.././UART Probe.cpp(76,1): undefined reference to `uart_putc(unsigned char)' D:\Dokumente\Dokumente\Projekte\Partyraumlampen\Probe\UART Probe\UART Probe\Debug/.././UART Probe.cpp(87,1): undefined reference to `uart_getc()' D:\Dokumente\Dokumente\Projekte\Partyraumlampen\Probe\UART Probe\UART Probe\Debug/.././UART Probe.cpp(103,1): undefined reference to `uart_puts_p(char const*)' D:\Dokumente\Dokumente\Projekte\Partyraumlampen\Probe\UART Probe\UART Probe\Debug/.././UART Probe.cpp(112,1): undefined reference to `uart_puts_p(char const*)' D:\Dokumente\Dokumente\Projekte\Partyraumlampen\Probe\UART Probe\UART Probe\Debug/.././UART Probe.cpp(120,1): undefined reference to `uart_puts_p(char const*)' D:\Dokumente\Dokumente\Projekte\Partyraumlampen\Probe\UART Probe\UART Probe\Debug/.././UART Probe.cpp(125,1): undefined reference to `uart_putc(unsigned char)' collect2.exe(0,0): ld returned 1 exit status make: *** [UART Probe.elf] Error 1 The command exited with code 2. Done executing task "RunCompilerTask" -- FAILED. Done building target "CoreBuild" in project "UART Probe.cppproj" -- FAILED. Done building project "UART Probe.cppproj" -- FAILED. Build FAILED. ========== Build: 0 succeeded or up-to-date, 1 failed, 0 skipped ==========
UART_Probe.cpp benenne sie mal als *.c um du mischst C++ und C - das geht schlecht.
>Hier noch die interessanten Dateien!
Du mixt da C++ und C. Nenn deine Uart_Prope.cpp mal Uart_Probe.c.
Da ist kein C++ drin.
ArduStemmi schrieb: > Die Benennung macht doch AVR Studio. Hat schon zigtausendmal > funktioniert! nein das machst du! Entweder legt man ein C oder eine C++ Datei an. Kannst es halt so lassen, dann geht es halt nicht.
ArduStemmi schrieb: > Die Benennung macht doch AVR Studio. Mit Sicherheit nicht. Auch AVR Studio ändert nicht eigenmächtig Dateianamen. > Hat schon zigtausendmal > funktioniert! Aber nicht in diesem Fall. Wenn deine Datei die Endung cpp hat, dann wird das als C++ Code compiliert. Und da kommt dann etwas ins Spiel, was man Name Mangling nennt. Kurz gesagt Für den Linker heissen die Funktionen dann nicht mehr so, wie du sie benannt hast bzw. der Compiler ruft dann die Funktionen mit anderem Namen auf, wenn er nicht weiss, dass du aus C++ Code heraus eine Funktion rufen willst, die mit dem C Compiler übersetzt wurde. Alternativ kannst du auch ein extern "C" rund um die UART Funktionen legen, wenn du sie unbedingt durch den C Compiler jagen willst. In a Nutshell: Solange du nicht weisst, was du tust, vermeide eine Mischung aus C++ und C. Du machst mir allerdings nicht den Eindruck, dass du wissen würdest was du da tust.
:
Bearbeitet durch User
Ich danke Euch wie verrückt! Ihr hattet Recht, ich hatte tatsächlich ein c++ Projekt angelegt. Das hatte ich zuvor noch nie getan! Und wich werde es auch nicht noch einmal tun! Herzlichen Dank für Eure Geduld!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.