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.
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.
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.
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.
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!