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
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
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.
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 ==========
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.
Alternativ kannst du auch unter #include "uart.h" auch einfach #include "uart.c" schreiben. Ist zwar nicht die feine englische ... aber sollte gehen.
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
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. |
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.