Forum: Mikrocontroller und Digitale Elektronik UART Bibliothek funktioniert nicht


von ArduStemmi (Gast)


Lesenswert?

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?

von Peter II (Gast)


Lesenswert?

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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Bernhard S. (dl9rdw)


Lesenswert?

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.

von ArduStemmi (Gast)


Lesenswert?

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!

von holger (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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

von Bernd K. (prof7bit)


Lesenswert?

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
von ArduStemmi (Gast)


Lesenswert?

@Holger: Was heißt: Füge die uart.c Deinem Projekt hinzu? Gibt es noch 
eine Möglichkeit, die ich im Moment übersehe?

von Peter II (Gast)


Lesenswert?

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"

von ArduStemmi (Gast)


Lesenswert?

Ja, das war ich! Wenn das so wie ich es da beschrieben habe richtig ist, 
dann geht es nicht!

von Peter II (Gast)


Lesenswert?

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.

von holger (Gast)


Lesenswert?

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

von ArduStemmi (Gast)


Lesenswert?

------ 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 
==========

von ArduStemmi (Gast)


Angehängte Dateien:

Lesenswert?

Hier noch die interessanten Dateien!

von Peter II (Gast)


Lesenswert?

UART_Probe.cpp


benenne sie mal als *.c um

du mischst C++ und C - das geht schlecht.

von ArduStemmi (Gast)


Lesenswert?

Die Benennung macht doch AVR Studio. Hat schon zigtausendmal 
funktioniert!

von holger (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
von ArduStemmi (Gast)


Lesenswert?

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