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
voidcan_senden();
6
7
8
#endif /* TESTBOARD_FUNKTIONEN_H_ */
Testboard_funktionen.c:
1
#include<avr/io.h>
2
#include"Testboard_funktionen.h"
3
4
5
voidcan_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
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.
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.
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.
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.
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.
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.
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?
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.
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)
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?
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.
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)
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"'.
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?
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
==========
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
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!!!