Forum: Compiler & IDEs Include erzeugt undefined reference


von Peter A. (Gast)


Angehängte Dateien:

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

von Karl heinz B. (kbucheg)


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.

von sous (Gast)


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.

von sous (Gast)


Lesenswert?

"Karl heinz Buchegger" war schneller und kompetenter!

von Peter A. (Gast)


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

von Walter (Gast)


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

von Peter A. (Gast)


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

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.