Forum: Compiler & IDEs Atmel Studio include


von Christian (Gast)


Lesenswert?

Hallo,

ich arbeite mit Atmel Studio 6 und möchte die Uart Lib. von Peter Fleury 
benutzen. Nur leider lässt sich Diese nicht in mein Projekt einbinden. 
Die .c und .h Dateien habe ich beide über den Solution Explorer mit Add 
Existing Item und im Programm mit #include "uart.h" eingebunden. Leider 
bekomme ich immer die Fehlermeldung:

undefined reference to `uart_init(unsigned int)' usw.

Es wird also die komplette .c Datei nicht erkannt.

Ich habe wie verrückt nach einer Lösung gesucht, aber leider nichts 
gefunden.
Ich hoffe Ihr könnt mir weiterhelfen. In welchen Ordner kommen die 
beiden Dateien und muss ich noch was beachten?

Gruß Christian

von Christian (Gast)


Lesenswert?

Jetzt habe ich wirklich alles versucht. Ich bekomme es einfach nicht 
eingebunden. Header files klappen ohen Probleme. Aber die .c Datei ist 
mir ein absolutes Rätzel.

Wie bindet Ihr denn Dateien im Atmel Studio ein?

Gruß

Christian

von Hans (Gast)


Lesenswert?

Ist schon der richtige Weg. Eigentlich sollte sie dann automatisch 
kompiliert und gelinkt werden. Es sei denn, Du hast z.B. unter den 
Eigenschaften (Properties) der C-Datei einstellt, dass sie nicht 
kompiliert werden soll.

Mach mal ein "Rebuild Project" und kopiere die ganze Ausgabe, die im 
Output-Fenster steht.

von Christian (Gast)


Lesenswert?

Danke für die Antwort. Wenn ich auf den File uart.c klicke, steht unter 
Build Action: Compile. Wo kann ich das noch verstellen. Unter Toolchain?
Hier ist einmal der Output. Im Anhang noch ein Bild vom Solution 
Explorer.

Gruß

Christian

------ Build started: Project: Hauptprogramm, Configuration: Debug AVR 
------
Build started.
Project "Hauptprogramm.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 
"C:\Users\Slitsch\Desktop\boot\Hauptprogramm\Hauptprogramm\Hauptprogramm 
.cppproj"  (target "Build" depends on it):
  Task "RunCompilerTask"
    C:\Program Files (x86)\Atmel\Atmel Studio 6.1\shellUtils\make.exe 
all
    Building target: Hauptprogramm.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 
Hauptprogramm.elf  Hauptprogramm.o uart.o   -Wl,-Map="Hauptprogramm.map" 
-Wl,--start-group -Wl,-lm  -Wl,--end-group -Wl,--gc-sections 
-mmcu=atmega32
    Hauptprogramm.o: In function `main':
C:\Users\Slitsch\Desktop\boot\Hauptprogramm\Hauptprogramm\Debug/.././Hau 
ptprogramm.cpp(15,1):  undefined reference to `uart_init(unsigned int)'
C:\Users\Slitsch\Desktop\boot\Hauptprogramm\Hauptprogramm\Debug/.././Hau 
ptprogramm.cpp(18,1):  undefined reference to `uart_puts_p(char const*)'
C:\Users\Slitsch\Desktop\boot\Hauptprogramm\Hauptprogramm\Debug/.././Hau 
ptprogramm.cpp(22,1):  undefined reference to `uart_getc()'
C:\Users\Slitsch\Desktop\boot\Hauptprogramm\Hauptprogramm\Debug/.././Hau 
ptprogramm.cpp(28,1):  undefined reference to `uart_puts(char const*)'
C:\Users\Slitsch\Desktop\boot\Hauptprogramm\Hauptprogramm\Debug/.././Hau 
ptprogramm.cpp(33,1):  undefined reference to `uart_puts(char const*)'
C:\Users\Slitsch\Desktop\boot\Hauptprogramm\Hauptprogramm\Debug/.././Hau 
ptprogramm.cpp(34,1):  undefined reference to `uart_putc(unsigned char)'
collect2.exe(0,0): ld returned 1 exit status
    make: *** [Hauptprogramm.elf] Error 1
    The command exited with code 2.
  Done executing task "RunCompilerTask" -- FAILED.
Done building target "CoreBuild" in project "Hauptprogramm.cppproj" -- 
FAILED.
Done building project "Hauptprogramm.cppproj" -- FAILED.

Build FAILED.
========== Build: 0 succeeded or up-to-date, 1 failed, 0 skipped 
==========

von Christian (Gast)


Angehängte Dateien:

Lesenswert?

Hier das Bild...

von Hans (Gast)


Lesenswert?

Sieht aus, als hättest Du ein C++-Projekt erstellt. Ist das Absicht? 
Wenn nicht, erstell das Projekt nochmal neu als C-Projekt.

Alternativ könntest Du auch die uart.c in uart.cpp umbenennen. Würde ich 
aber nicht empfehlen.

von ich, nicht du (Gast)


Lesenswert?

Alternativ kannst du auch unter #include "uart.h" auch einfach #include 
"uart.c" schreiben.

Ist zwar nicht die feine englische ... aber sollte gehen.

von Oliver (Gast)


Lesenswert?

ich, nicht du schrieb:
> Ist zwar nicht die feine englische ... aber sollte gehen.

und ist der mit Abstand schlechteste Rat, den man geben kann.

Oliver

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Beim Mischen von C- und C++-Code gibt es Probleme mit dem Linker, weil 
der Compiler unterschiedliche Symbolnamen in die Objektdatei einsetzt.

Abhilfe: In der C++-Datei muss die #include-Anweisung für die die 
C-Datei beschreibende Headerdatei als extern "C" eingebunden werden. 
Damit weiß der Compiler, daß die in der Headerdatei deklarierten Symbole 
als C-Code und nicht als C++Code zu interpretieren sind.

Also in Hauptprogramm.cpp
1
#include <util/delay.h>
2
extern "C"
3
{
4
  #include "uart.h"
5
}
6
7
etc. etc.

von Christian (Gast)


Lesenswert?

Ich hatte es schon gelöst. Liegt in der Tat am Mischen von c++ und c. 
Habe die c in eine c++ kopiert und es lief.

Trotzdem vielen Dank für die Antworten.

Gruß Christian

von Wolfgang (Gast)


Lesenswert?

Christian schrieb:
> Habe die c in eine c++ kopiert und es lief.

Das ist nicht besser als:

Hans schrieb:
> Alternativ könntest Du auch die uart.c in uart.cpp umbenennen. Würde ich
> aber nicht empfehlen.

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.