Hallo! Vielleicht kann mir hier jemand helfen (schon mal danke im Vorraus)! test.c: void ab(void); uint32_t auf(void); void gerade(wert3); volatile float wert1; volatile uint32_t wert2; volatile uint32_t wert3; test.h: #ifndef INCLUDED_blabla #define INCLUDED_blabla float_wert1; uint32_t_wert2; uint32_t_wert3; extern void gerade(wert3); void ab(void); uint32_t auf(void); #endif file.c: hier ruf ich z.B. gerade(200) auf aber es kommt folgende fehlermeldung: undefined reference to gerade hab ein bischen herumprobiert mit static, inline, extern, aber bekomme den Error nicht weg. Vielleicht kann mir jemand erklären wie ich das Header file richtig anlege, lg
Rene wrote: > uint32_t_wert2; > uint32_t_wert3; Was sollen denn die beiden Zeilen? Generell gehören in eine Headerdatei nur Deklarationen und keine Definitionen. Es mag zwar Ausnahmefälle geben, in denen es Sinn machen kann, auch Definitionen dort unterzubringen, aber im Regelfall ist das Mumpitz. Wenn man ein Projekt aus mehreren Sourcen hat, dann wird für jede einzelne Quelldatei (sofern erforderlich) eine Headerdatei angelegt, in der die Deklarationen von Variablen und Funktionen, die auch für andere Module zugänglich sein sollen, angegeben werden. Eine Variable bzw. Funktion darf in einem Projekt nur einmal definiert werden, aber beliebig oft deklariert. Abgesehen davon kann man aus Deinem Geschreibsel oben überhaupt nicht erkennen, was das ganze eigentlich soll.
Rene wrote: > hab ein bischen herumprobiert mit static, inline, extern, aber bekomme > den Error nicht weg. Rumprobieren bringt beim Programmieren auch in den seltensten Fällen etwas, v.a. dann nicht, wenn man überhaupt keinen Schimmer hat, was static, inline, extern usw. überhaupt bedeuten! Besorg Dir ein gutes C-Buch und eigne Dir die Grundlagen systematisch an.
probier mal: test.c:
1 | volatile float wert1; |
2 | volatile uint32_t wert2; |
3 | volatile uint32_t wert3; |
4 | |
5 | void ab(void) |
6 | {
|
7 | |
8 | }
|
9 | |
10 | uint32_t auf(void) |
11 | {
|
12 | |
13 | }
|
14 | |
15 | void gerade(uint32_t wert3) |
16 | {
|
17 | |
18 | }
|
test.h:
1 | #ifndef INCLUDED_blabla
|
2 | #define INCLUDED_blabla
|
3 | |
4 | void gerade(uint32_t); |
5 | void ab(void); |
6 | uint32_t auf(void); |
7 | |
8 | #endif
|
dann kannst du in file.c (wenn test.h eingebunden wird) alle drei Fkt. aufrufen
Hab es jetzt genau so probiert wie im Beitrag von Jan. Bekomme aber noch immer die Fehlermeldung 'undefined reference' to gerade Hat jemand eine Idee?
vielleicht mach ich ja den funktionsaufruf irgendwie falsch: z.B. gerade(200); muss ich hier vielleicht noch was dazuschreiben?
Rufus t. Firefly wrote: > In "file.c" fehlt > > #include "test.h" Dann gäbe es keinen "undefined reference" Fehler, sondern nur eine "implicit declaration" Warnung. @Rene: test.o nicht dazugelinkt, oder Tippfehler beim Namen in test.c.
Wie wird der Compiler/Linker aufgerufen? Makefile geändert? Welche IDE wenn überhaupt? Kannst du mal die ganze Audgabe posten?
verwende dev-C++, das makefile hab ich nicht geändert (nur den filename damit er das richtige file compiliert)
runninglight.elf: $(SRCDIR)/runninglight.o -> runninglight.elf: $(SRCDIR)/runninglight.o $(SRCDIR)/timer.o
danke, sehr hilfreicher tipp. noch eine kurze frage: in timer.c bekomm ich die fehlermeldung multiple definition of 'main' hast du diesen error schon mal gehabt?
Jedes globale Objekt darf es im ganzen Programm nur einmal geben. Du kannst nicht verschiedenen Funktionen den selben Namen geben (es sei denn sie sind static deklariert).
Ich habe mir den Code angesehen, weit + breit keine gerade() gefunden. Aber ich stimme Johannes M. (johnny-m) voll zu: > Besorg Dir ein gutes C-Buch und eigne Dir die Grundlagen systematisch an. Denn schon das: > void gerade(wert3); macht ohne Typdefinition für wert3 keinen Sinn. Und imho weißt du nicht, was eine Typdefinition ist.
war ja nur eine erfundene fkt um das ganze abzukürzen hab noch ein problem: wenn ich das makefile so ändere wie oben vorgeschlagen und die main von runninglight.c mit static deklariere führt er mir immer die main von timer.c aus. Probier ich es umgekehrt bekomme ich eine fehlermeldung undefined reference to main Wie ist es möglich dass die main von runninglight.c ausgeführt wird?
Mann, es muss in jedem C- bzw. C++-Programm genau eine globale Funktion mit dem Namen main geben! Eine einzige und keine mehr!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.