UART Bibliothek funktioniert nicht

Gast #3919149
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?
Gast #3919175
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!
Gast #3919178
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".
#3919180
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.
Gast #3919204
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.
Gast #3919211
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 
==========
#3919231
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.
Gast #3919247
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!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren