mikrocontroller.net

Forum: Compiler & IDEs Include erzeugt undefined reference


Autor: Peter A. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!
Ich möchte für ein Projekt einen Frequenzumrichter ansteuern. Um keine 
Riesen Codewurst zu erhalten würde ich die einzelnen Programmfunktionen 
gerne als externe Funktionen inkludieren.
Im Anhang ist der fertige Programmteil zum FU Testen. Wenn alles in 
dieser einen Datei steht, dann funktioniert das compilieren. Sie hat 
normalerweise den namen motioncpu.c

(Die Funktion wartelang dient nur zum herumtesten und bleibt so nicht im 
Programm.)

Als ersten Versuch zum Inkludieren hab ich folgendes Probiert:
Im Verzeichniss des C- Files gibt es die Datein:
______________________________________________

motioncpu.h (mit dem Inhalt:)
//Definitionen
//Portdefinitionen
#define fudir PORTA //Ausgangsport für FU Optokoppler Richtung
#define fufkt PORTE //Ausgangsport für FU Optikoppler Sonderfunktionen
define dpctr PORTG  //Ausgangsport für das Digipoti

//Bitdefinitionen
#define furlf PINA6 //Ausgangspin Frequenzumrichter Rechtslauf
#define fullf PINA7 //Ausgangspin Frequenzumrichter Linkslauf
#define fumu1 PINE2 //Ausgangspin Frequenzumrichter Sonderfunktion 1
#define fumu2 PINE3 //Ausgangspin Frequenzumrichter Sonderfunktion 2
#define dpinc PING0 //Ausgangspin Digipoti Zaehlpuls
#define dpupd PING1 //Ausgangspin Digipoti Zaehlrichtung
#define dpena PING2 //Ausgangspin Digipoti

void wartelang (void); //Subroutine die einfach nur lange wartet

_________________________________

motioncpufu.c (mit dem Inhalt:)

#include "motioncpufu.h"

void wartelang ()
{
 while (zeit)
 {
   zeit--;
 }
}
__________________________________________

und die "originale" Datei motioncpu der die Funtkion Wartelang fehlt (da 
sie in motioncpufu geschoben wurde.

Bei den Includefiles von motioncpu.c ist ebenfalls
#include "motioncpufu.h" hinzugefügt
__________________________________________

Beim compilieren tritt der fehler undefied referece to wartelang auf.

Wenn statt wartelang eine andere "Funktion" in die externe C Datei 
kommt, dann ist der Fehler der selbe mit dieser Funktion.

Wenn nur die definitionen der Ports und Pins in der Headerdatei stehen, 
dann funktioniert das Compilieren.

Da dies meine ersten Gehversuche mit C sind bitte ich um Verzeihung wenn 
ich so einen Riesenpost für einen Anfängerfehler verursacht habe.

Ich würde gern wissen wie ich Programmcode und Funktionen in eigenen C - 
Files einbinen kann.

Danke schon mal für Eure Antworten
 MFG
  Peter

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> undefied referece

undefined reference ist kein Fehler, der vom Compiler kommt,
sondern vom Linker.

Um dein fertiges Programm aus den einzelnen Bausteinen
zusammenzubauen (zu 'linken'), muss der Linker jetzt
2 Bausteine (2 Object-files) zum EXE linken:
  motioncpu.o
  motioncpufu.o

(oder die gleichnamigen *.obj Dateien. Ob die jetzt *.o
oder *.obj heissen, hängt vom System ab auf dem du
arbeitest).

Du hast deinem Linker aber nur 1 Datei angegeben:
  motioncpu.o

Dort gibt es nirgends eine Funktion namens 'wartelang'.
Diese Funktion wäre in der Datei motioncpufu.o. Nur
unglücklicherweise lässt der Linker die links liegen, da
du ihm nicht mitgeteilt hast, dass die auch dazugehört.

Autor: sous (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Fehlermeldung "undefined referenz to 'uhu' " bedeutet folgendes:
Irgendwo im Quellcode steht ein Aufruf dieser Funktion.
Diese Funktion ist jedoch nirgens implementiert (sprich: es gibt diese 
Funktion nicht).

Im File "motioncpu_ohne_includes.c" sehe ich Aufrufe der besagten 
Funktion. Wenn Du dem Compiler jedoch den Quellcode von 'wartelang' 
vorenthälst, dann kann er halt nix draus machen.

Autor: sous (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
"Karl heinz Buchegger" war schneller und kompetenter!

Autor: Peter A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Danke für die schnellen Antworten!
Nun hab ich wieder einen Mosaikstein auf dem Weg zu C erhalten!.

Ich glauch auch herausgefunden zu haben, wie ich das File angebe.

Ich verwende AVR Studio 4.12 Service Pack 4.
Wenn ich die Dateien als Source angebe dann ist der Fehler weg.
Nur hab ich jetzt noch einen Fehler bei der Varaiablendefinition. Wenn 
ich die Variable Zeit nicht auch in der 2 Datei definiere, dann kommt 
die Fehlermeldung 'zeit' undeclared.
Ich hoffe es gibt eine Möglichkeit, die Variablen über alle Includefiles 
hinweg zu definieren!

Besten Dank für die Guten Erklärungen - ohne die hätt ichs 
wahrscheinlich nie herausgefunden.

MFG
 Peter

Autor: Walter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sinnvollerweise übergibt man zeit als Parameter an das Unterprogramm,

wenn du aber unbedingt eine globale Variable willst:
in einer! C-Datei mit int zeit definieren, in der anderen als extern int 
zeit deklarieren (oder in einer Headerdatei)

Gruß
Walter

Autor: Peter A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super!
Hier wird einem ja rund um die Uhr geholfen!
Das mit der Übergabe als Parameter stimmt - ich habs jetzt so
gelöst wie Du es vorgeschlagen hast.
Jetzt funktioniert es tadellos!
Schönes Wochenende Euch allen!
 Peter

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.