Forum: Mikrocontroller und Digitale Elektronik "undefined reference to" Problem (Anfängerfrage)


von Hias (Gast)


Lesenswert?

Hallo Zusammen,

bin leider zu doof um eine Funktion in ein seperates *.c file 
auszulagern.
Bekomme folgende Fehlermeldung:
Error  11  undefined reference to `can_senden()'

Mein code sieht im wesentlichen so aus:

main.c:
1
#include "Testboard_funktionen.h"
2
3
while(1)
4
{
5
can_senden();
6
}

Testboard_funktionen.h:
1
#ifndef TESTBOARD_FUNKTIONEN_H_
2
#define TESTBOARD_FUNKTIONEN_H_
3
4
5
void can_senden();
6
7
8
#endif /* TESTBOARD_FUNKTIONEN_H_ */

Testboard_funktionen.c:
1
#include <avr/io.h>
2
#include "Testboard_funktionen.h"
3
4
5
void can_senden()
6
{
7
  //hier soll später die Funktion entstehen
8
}

habe schon im Forum versucht eine Lösung zu finden, leider ohne Erfolg.
Bin der Meinung, dass ich es schon richtig gemacht habe...
Vllt. kann mir von euch jemand helfen

von Peter II (Gast)


Lesenswert?

hast du denn die Datei "Testboard_funktionen.c"  auch zum Projekt 
hinzugefügt?

von Uwe .. (uwegw)


Lesenswert?

In Header muss die Funktion als extern void deklariert werden.
Und wie schon gesagt, die c-Datei muss mitkompliert werden. Poste mal 
die komplette Ausgabe des Compliers und nicht nur die Zeile mit der 
Fehlermeldung.

von Peter II (Gast)


Lesenswert?

Uwe ... schrieb:
> In Header muss die Funktion als extern void deklariert werden.

nein muss sie nicht. der Extern ist nicht notwenig. Das braucht man bei 
variablen.

von Karl H. (kbuchegg)


Lesenswert?

Uwe ... schrieb:
> Poste mal
> die komplette Ausgabe des Compliers und nicht nur die Zeile mit der
> Fehlermeldung.

Die ist ziemlich uninteressant.
"undefined reference" ist eine Fehlermeldung vom Linker und ist recht 
eindeutig: Eine vom Programm benutzte Resource (Variable, Funktion) 
konnte beim Linken nicht aufgelöst werden.

Das kann sein, weil es Tippfehler im Namen gabe und es daher die 
Funktion tatsächlich wirklich nicht gibt oder aber ganz banal, dass das 
Object-File mit der Funktion nicht gelinkt wurde. Und das wiederrum ist 
in einer IDE ein Hinweis darauf, dass man vergessen hat, das C-File mit 
der Funktion zum Projekt hinzuzufügen. Und genau der Fall liegt mit 99% 
Wharscheinlichkeit vor, weil Leute die sowas noch nie gamcht haben, das 
ganz einfach nicht wissen.
C-File zum Projekt dazu, und die Sache ist gegessen.

von Arne (Gast)


Lesenswert?

Peter II schrieb:
> Uwe ... schrieb:
>> In Header muss die Funktion als extern void deklariert werden.
>
> nein muss sie nicht. der Extern ist nicht notwenig. Das braucht man bei
> variablen.

Korrekt. Wenn nichts da steht, gilt "extern" implizit als vereinbart.
Fehler "undefined reference" heisst für mich, dass der Linker die 
Funktion nicht findet, da Testboard_funktionen.o nicht hinzugelinkt 
wurde.

von Nobody (Gast)


Lesenswert?

Versuch es doch mal mit, "void can_senden(void)" anstatt "void 
can_senden()" (sowohl im Header- als auch im .c-File). Manche Compiler 
haben damit Probleme.

von Peter II (Gast)


Lesenswert?

Nobody schrieb:
> Versuch es doch mal mit, "void can_senden(void)" anstatt "void
> can_senden()" (sowohl im Header- als auch im .c-File). Manche Compiler
> haben damit Probleme

wenn es C ist, dann ist das (void) richtig. Das hat auch einen grund und 
sollte nicht weggelassen werden.

von Hias (Gast)


Lesenswert?

Danke für die schnellen Antworten!

mit "void can_senden(void)" klappt es jetzt.

Vielen Dank!

von Hias (Gast)


Lesenswert?

allerdings muss ich auch das *c file includieren, dass sollte eigentlich 
nicht sein, oder?

von Peter II (Gast)


Lesenswert?

Hias schrieb:
> allerdings muss ich auch das *c file includieren, dass sollte eigentlich
> nicht sein, oder?

das solltest du auf keine Fall machen. Auch das mit dem void kann nicht 
das Problem gewesen sein - denn der linker ist bei C das void ziemlich 
egal.

steht denn bei dir die C Datei in den Projekt einstellungen mit drin?

von Karl H. (kbuchegg)


Lesenswert?

Hias schrieb:
> Danke für die schnellen Antworten!
>
> mit "void can_senden(void)" klappt es jetzt.


Das ist schön. Ist aber nicht der Grund für deinen Fehler.

von Ralf G. (ralg)


Lesenswert?

Hias schrieb:
> allerdings muss ich auch das *c file includieren

Das muss nicht sein!
Das muss zu den Projektdateien mit dazu.

von Karl H. (kbuchegg)


Lesenswert?

Hias schrieb:
> allerdings muss ich auch das *c file includieren, dass sollte eigentlich
> nicht sein, oder?

Exakt. Das solltest du nicht tun.

Welchen Teil von "du musst das C-File zu deinem Projekt hinzufügen" hast 
du nicht verstanden.
Wenn du nicht weißt, wie das in deiner IDE geht, dann sags halt einfach 
(und sag auch welche IDE du verwendest)

von Hias (Gast)


Lesenswert?

wie erkenne ich ob die Datei in den Objektdateien mit drin ist?
habe sie im AVR Studio über add -> new item hinzugefügt.

im Soloution Explorer stehen das *.c und *.h file unter meiner main.c
damit sollten sie dem Projekt doch hinzugefügt sein?

von Karl H. (kbuchegg)


Lesenswert?

Lies mal
FAQ
den Punkt 8: Ich hab da mehere ....

von Karl H. (kbuchegg)


Lesenswert?

Hias schrieb:
> wie erkenne ich ob die Datei in den Objektdateien mit drin ist?

Die ist sopwieso mit dabei. Wenn das C-File im Projekt ist, dann ist es 
auch das Object-File.

> im Soloution Explorer stehen das *.c und *.h file unter meiner main.c
> damit sollten sie dem Projekt doch hinzugefügt sein?

Das h-File gehört da zwar so nicht hin, spielt aber jetzt erst mal keine 
Rolle. Das c-File ist wichtig.

So gesehen, passt das. Mach mal einen Screenshot, damit man sich die 
Sache mal ansehen kann.

von Karl H. (kbuchegg)


Lesenswert?

Sicherheitshalber auch mal einen Doppelklick auf das C-File im 
Projektbaum. Geht dann im Editor das richtige File auf?
(vorher alle Edit-Fenster schliessen, dann gibts auch keine 
Verwechslungen)

von Hias (Gast)


Angehängte Dateien:

Lesenswert?

Hier mal ein Screenshot

das "Steuergeraet_geruest" ist mein "Hauptfile"

wenn ich das *.c file doppelklicke öffnet sich das richtige file

von Stefan E. (sternst)


Lesenswert?

Dein Problem ist, dass die eine Datei als C++ übersetzt wird, und die 
andere als C (wegen der Dateiendungen). Falls das Absicht sein sollte 
(was ich aber bezweifle), dann informiere dich über 'extern "C"'.

von Hias (Gast)


Lesenswert?

nein das ist keine Absicht.

das hatte ich bisher auch übersehen.

kann ich aus dem *.cpp file ein *.c file machen?
oder wie sollte ich das Problem am besten lösen?

von Peter II (Gast)


Lesenswert?

Hias schrieb:
> kann ich aus dem *.cpp file ein *.c file machen?

ja, einfach umbennen.

von Hias (Gast)


Lesenswert?

Peter II schrieb:
> Hias schrieb:
>> kann ich aus dem *.cpp file ein *.c file machen?
>
> ja, einfach umbennen.

Klappt leider nicht...
muss ich das Projekt neu Anlagen (als C-Projekt) ?

hier die Fehlermeldung wenn ich das *.cpp file in ein *.c file 
umbenenne:

------ Build started: Project: Steuergeraet_geruest, Configuration: 
Debug AVR ------
Build started.
Project "Steuergeraet_geruest.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.0\Vs\Compiler.targets" from project "C:\Users\mom\Documents\Atmel 
Studio\ICON_INCAR_Testboard\Steuergeraet_geruest\Steuergeraet_geruest.cp 
pproj"  (target "Build" depends on it):
  Task "RunCompilerTask"
    C:\Program Files (x86)\Atmel\Atmel Studio 6.0\make\make.exe all
  Done executing task "RunCompilerTask" -- FAILED.
Done building target "CoreBuild" in project 
"Steuergeraet_geruest.cppproj" -- FAILED.
Done building project "Steuergeraet_geruest.cppproj" -- FAILED.

Build FAILED.
========== Build: 0 succeeded or up-to-date, 1 failed, 0 skipped 
==========

von troll (Gast)


Lesenswert?

Du hast ein C++ Projekt im AVR Studio angelegt. Probiere mal ein neues 
Projekt (C!!) zu erstellen und dann die .c und .h Dateien (keine .cpp), 
die du bereits hast, dort einzufügen

von Hias (Gast)


Lesenswert?

troll schrieb:
> Du hast ein C++ Projekt im AVR Studio angelegt. Probiere mal ein neues
> Projekt (C!!) zu erstellen und dann die .c und .h Dateien (keine .cpp),
> die du bereits hast, dort einzufügen

so, habe mich heute nochmal hingesetzt und das Projekt neu erstellt (als 
C-Projekt)

und siehe da: es klappt jetzt.

Vielen Dank nochmal für die schnelle und kompetente Hilfe!!!

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.