Hallo Leute, ich bin ein blutiger Anfänger was die Programmierung von µC's angeht, von daher bitte ich schon jetzt um Entschuldigung für vielleicht stupide Fragen. Mein Problem: Ich möchte ein Programm schreiben, welches die vorgefertigten Include-Datein der AVR Butterfly Software verwenden soll, speziell geht es dabei um die ADC.h; Button.h; LCD_functions.h usw. Wenn ich mir nun die .h und die .c Datein aus dem ursprünglichen Verzeichnis in meinen "neuen Programmordner" Ordner kopiere und anschließend mein Programm mit "Make All" oder "Extcoff" kompilieren möchte kommen stets viele Fehlermeldungen. siehe hier: C:\Dokumente und Einstellungen\Heinke\Desktop\Neuer Ordner/Termnal.c:328: undefined reference to `LCD_puts' C:\Dokumente und Einstellungen\Heinke\Desktop\Neuer Ordner/Termnal.c:333: undefined reference to `LCD_puts' ..................usw. Kann mir da jmd helfen? Habe mich heute den ganzen Nachmittag damit befasst. Wie kann ich die Include Dateien für mich nutzen?? Bin für jede Antwort dankbar. Ich wünsche euch noch einen schönen Samstag Abend.
Du suchst mit den Include-Dateien am falschen Ende. Was Dir fehlt, ist der Code für LCD_puts. Wohlerzogene Include-Dateien tragen nur Informationen bei, die für den momentanen Übersetzungsvorgang wichtig sind (z.B. die Information, dass es woanders einen LCD_puts() gibt, welche Parameter das erwartet und was es zurückgibt). Damit hast Du aber noch kein LCD_puts(), das musst Du noch liefern. Das tust Du, indem Du das *.c-File, das den Code für LCD_puts() enthält, als weitere Quelldatei angibst.
Vielen Dank für deine Antwort nur leider weiß ich noch nicht ganz was du meinst. Wäre wirklich nett wenn du mir das noch ein bisschen näher erläutern könntest. Zur Untestützung hier mal mein Quelltext. Kurz vorweg: mein Programm soll zunächst noch nichts ausführen, ich wollte damit lediglich die Funktionalität der Include Dateien prüfen: Programm: "Belüftung.c"
1 | |
2 | #include <avr/io.h> |
3 | #include "LCD_functions.h" |
4 | #include "LCD_driver.h" |
5 | #include "button.h" |
6 | |
7 | int main() |
8 | {
|
9 | }
|
Die Dateien befinden sich alle im selben Verzeichnis wie mein Programm. Ich hatte ja vermutet, dass es etwas damit zu tun hat das diese Include Datein aufeinander aufbauen bzw sich aufeinander beziehen.
Noch ein kleiner Nachtrag, ich denke ich habe soeben verstanden was du mir sagen wolltest. Allerdings denke ich ist das nicht der Punkt. Die Funktion LCD_puts() verwende ich ja gar nicht in meinem Quelltext. Diese Funktion ist in der Datei "LCD_functions.c" enthalten und wird dort beschrieben, es reicht doch aber aus nur die "LCD_functions.h" einzufügen oder nicht? Wo ist eigentlich der Unterschied zwischen diesen beiden Dateien?
Hast du denn LCD_functions.c in dein Makefile als source datei eingetragen?
Nein hatte ich nicht, allerdings liegts daran auch nicht habe es ausprobiert. Die *.c Files müssten laut "Makefile_Template" automatisch eingefügt werden. Habe jetzt so ziemlich viel ausprobiert und nix klappt, habe keine Ahnung mehr woran das liegen kann. Ich glaub das ist jetzt der richtige Zeitpunkt für'n Bier. ;)
Vielleicht können wir die Umgebung erst mal klären: - Du verwendest WinAVR? - Mit Makefile oder der Projekt-Arbeitsumgebung von AVR Studio? - Woher stammt die Datei Termnal.c, in der LCD_puts() aufgerufen wird? - Wieso ist die Teil des zu übersetzenden Programms, wenn Du sagst, LCD_puts() würde von Dir nie aufgerufen? Vielleicht kommen wir so der Sache näher.
Also ich verwende WinAVR und schreibe dann meinen Quellcode mit Notepad 2 und kompiliere dann, nachdem ich mir eine Makefile erzeugt habe mit "Make All". Die Datei Termnal.c ist ein selbstgeschriebenes Programm, dass ich von meinem Vorgänger übernommen habe. Bitte entschuldigt, ich bin vor lauter rumprobieren selbst durcheinander gekommen. Die Fehlermeldungen, die oben zu sehen sind treten auf wenn ich versuche dieses Termnal.c zu kompilieren. Es sind eigentlich alle wichtigen Include Dateien vorhanden und auch im selben Verzeichnis. @Hazeh: Könnte ich Dir den Quelltext vielleicht einmal schicken (samt Include Datein)??
nochmal: Diese Fehlermeldung hat nichts mit dem Include File an sich zu tun. Beim Zusammenbau des vollständigen Programs beschwert sich der Linker, dass er die Implementierung für LCD_puts nicht finden kann (eine Funktion die in terminal.c verwendet wird). Die Implementierung der LCD_puts ist aber gar nicht in lcd.h enthalten. Dort ist nur die Beschreibung drinnen, dass es eine derartige Funltion gibt. Irgendwo wird es noch eine Datei lcd.c geben. Die enthält die tatsächliche Implementierung und muss mit ins Makefile
> @Hazeh: Könnte ich Dir den Quelltext vielleicht einmal schicken (samt > Include Datein)?? Das wird nicht nötig sein. Wenn Du Dir den Quelltext 'Termnal.c' anschaust, wirst Du feststellen, dass er in Zeile 328 und 333 LCD_puts() aufruft. Also musst Du irgendwo den Quellcode für LCD_puts() auch liefern. Geh' mal auf die Suche. Du wirst es nicht finden, jedenfalls nicht unter den Quelltexten, die Du im Makefile benannt hast. Möglicherweise wird es irgendwo unter den Projektdateien sein, aber halt nicht unter denen, die Du dort (im Makefile) angegeben hast. Zu den Include-Dateien kann ich Dir nur nochmal ans Herz legen, was Karl heinz und ich dazu schon gesagt haben: die enthalten üblicherweise nicht den ausführbaren Code, sondern nur Begleitinformationen für den Compiler. Du musst unterscheiden zwischen einer Deklaration wie
1 | void LCD_puts(char *text); |
die gar nichts tut als dem Compiler mitzuteilen, wie LCD_puts() anzusprechen ist, und der Definition von LCD_puts:
1 | void LCD_puts(char *text){ |
2 | // ... Ladung von Anweisungen, die LCD_puts() ausmachen ..
|
3 | }
|
Die erste Form findet sich typischerweise in einem Include-File wieder, die zweite in einer *.c-Datei.
OK vielen Dank, ich glaube ich habe verstanden. Ich trage also nun einfach noch im Makefile die *.c Dateien unter "Source" mit ein und dann sollte es funktionieren?! Vielen Dank für eure Hilfe.
Ja. Wenn Du weißt, dass die *.c-Dateien vollständig sind und auch, dass sich keine nicht mehr benutzte darunter finden, ist das so.
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.