www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik AVR Butterfly ATmega169 - Probleme mit Include Dateien der vorinstallierten Software


Autor: Marcus H. (Firma: Student) (stromberg001)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Marcus H. (Firma: Student) (stromberg001)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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"
 
#include <avr/io.h>
#include "LCD_functions.h"
#include "LCD_driver.h"
#include "button.h"

int main()
{
}

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.

Autor: Marcus H. (Firma: Student) (stromberg001)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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?

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du denn LCD_functions.c in dein Makefile als source datei 
eingetragen?

Autor: Marcus H. (Firma: Student) (stromberg001)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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. ;)

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Marcus H. (Firma: Student) (stromberg001)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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)??

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> @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
void LCD_puts(char *text);
die gar nichts tut als dem Compiler mitzuteilen, wie LCD_puts() 
anzusprechen ist, und der Definition von LCD_puts:
void LCD_puts(char *text){
  // ... Ladung von Anweisungen, die LCD_puts() ausmachen ..
}
Die erste Form findet sich typischerweise in einem Include-File wieder, 
die zweite in einer *.c-Datei.

Autor: Marcus H. (Firma: Student) (stromberg001)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.