Forum: Compiler & IDEs header file erzeugung


von Rene (Gast)


Lesenswert?

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

von Johannes M. (johnny-m)


Lesenswert?

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.

von Johannes M. (johnny-m)


Lesenswert?

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.

von ... .. (docean) Benutzerseite


Lesenswert?

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

von Rene (Gast)


Lesenswert?

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?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

In "file.c" fehlt

#include "test.h"

von Rene (Gast)


Lesenswert?

nein das ist es nicht, hab ich wohl drinnen stehn

von Rene (Gast)


Lesenswert?

vielleicht mach ich ja den funktionsaufruf irgendwie falsch:

z.B. gerade(200);

muss ich hier vielleicht noch was dazuschreiben?

von Stefan E. (sternst)


Lesenswert?

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.

von ... .. (docean) Benutzerseite


Lesenswert?

Wie wird der Compiler/Linker aufgerufen?

Makefile geändert?

Welche IDE wenn überhaupt?

Kannst du mal die ganze Audgabe posten?

von Rene (Gast)


Angehängte Dateien:

Lesenswert?

verwende dev-C++, das makefile hab ich nicht geändert (nur den filename 
damit er das richtige file compiliert)

von Rene (Gast)


Angehängte Dateien:

Lesenswert?

hier das makefile

von Stefan E. (sternst)


Lesenswert?

runninglight.elf: $(SRCDIR)/runninglight.o
->
runninglight.elf: $(SRCDIR)/runninglight.o $(SRCDIR)/timer.o

von Rene (Gast)


Lesenswert?

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?

von Stefan E. (sternst)


Lesenswert?

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).

von Rene (Gast)


Lesenswert?

danke

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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.

von Rene (Gast)


Lesenswert?

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?

von Johannes M. (johnny-m)


Lesenswert?

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
Noch kein Account? Hier anmelden.