mikrocontroller.net

Forum: Compiler & IDEs header file erzeugung


Autor: Rene (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
probier mal:

test.c:
volatile float wert1;
volatile uint32_t wert2;
volatile uint32_t wert3;

void ab(void)
{

}

uint32_t auf(void)
{

}

void gerade(uint32_t wert3)
{

}


test.h:
#ifndef INCLUDED_blabla
#define INCLUDED_blabla

void gerade(uint32_t);
void ab(void);
uint32_t auf(void);

#endif

dann kannst du in file.c (wenn test.h eingebunden wird) alle drei Fkt. 
aufrufen

Autor: Rene (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
In "file.c" fehlt

#include "test.h"

Autor: Rene (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nein das ist es nicht, hab ich wohl drinnen stehn

Autor: Rene (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vielleicht mach ich ja den funktionsaufruf irgendwie falsch:

z.B. gerade(200);

muss ich hier vielleicht noch was dazuschreiben?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: ... ... (docean) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wird der Compiler/Linker aufgerufen?

Makefile geändert?

Welche IDE wenn überhaupt?

Kannst du mal die ganze Audgabe posten?

Autor: Rene (Gast)
Datum:
Angehängte Dateien:

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

Autor: Rene (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hier das makefile

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
runninglight.elf: $(SRCDIR)/runninglight.o
->
runninglight.elf: $(SRCDIR)/runninglight.o $(SRCDIR)/timer.o

Autor: Rene (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Rene (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rene (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mann, es muss in jedem C- bzw. C++-Programm genau eine globale 
Funktion mit dem Namen main geben! Eine einzige und keine mehr!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.