Forum: Compiler & IDEs ac6 Compiler Include Reihenfolge Verständnisfrage!


von Simon W. (simon1711)


Lesenswert?

Hallo Zusammen,

folgendes Problem macht mich momentan Verrückt:

Ich verwenden in AC6 mit einem STM32 das FreeRTOS.
Für Funktionen wie osDelay() und Semaphoren ect. steht am Anfang meiner 
jew. C/H-Dateien "#include "cmsis_os.h"".

Nach meinem bisherigen Verständnis nimmt der Compiler jede einzelnen 
C-Datei (Reihenfolge weis ich nicht) und erstellt daraus eine 
Object-Datei. Der Precompiler ersetzt vorher alle "Includes" mit dem 
Inhalt der jew. H-Dateien.

Um zu Verhindern, dass H-Dateien in einer Endlosschleife Eingefügt 
werden (falls gegenseitige Abhängigkeiten existieren), gibt es die 
"include guards" mit der #ifdef Direktive am Anfang jeder H-Datei. Diese 
Defines gelten allerdings nur innerhalb einer C-Datei. D.h. wird die 
H-Datei in einer anderen C-Datei mit Include eingebunden, existiert 
dieses guard define nicht und die H-Datei wird komplett eingefügt.

Und ich glaube genau im letzten Satz steckt mein Fehler. Wird z.B. in 
der Main.C ein H-File Includiert und in einem anderen Header welcher 
wiederum auch von Main.C includiert wird, sind die Symbole aus diesem 
Header in main.C nicht bekannt.

Genau dieses Problem habe ich nun in meinem gesamten Projekt mit der 
"cmsis_os.h"".

ich hoffe das kam halbwegs verständlich rüber...

Vielen dank!
Simon

von Peter II (Gast)


Lesenswert?

Simon W. schrieb:
> Und ich glaube genau im letzten Satz steckt mein Fehler. Wird z.B. in
> der Main.C ein H-File Includiert und in einem anderen Header welcher
> wiederum auch von Main.C includiert wird, sind die Symbole aus diesem
> Header in main.C nicht bekannt.

ich glaube das versteht niemand.

wenn die main.c einen Header includiert dann sind auch die Symbole 
bekannt.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Simon W. schrieb:
> Hallo Zusammen,
>
> folgendes Problem macht mich momentan Verrückt:
>
> Ich verwenden in AC6 mit einem STM32 das FreeRTOS.
> Für Funktionen wie osDelay() und Semaphoren ect. steht am Anfang meiner
> jew. C/H-Dateien "#include "cmsis_os.h"".
>
> Nach meinem bisherigen Verständnis nimmt der Compiler jede einzelnen
> C-Datei (Reihenfolge weis ich nicht) und erstellt daraus eine
> Object-Datei.

> der Main.C

Das ist eine C++ Datei, vielleicht liegt da das Problem: Mischen von C 
und C++.

von Simon W. (simon1711)


Lesenswert?

Hallo,
danke für eure Antworten!

Peter II schrieb:
> wenn die main.c einen Header includiert dann sind auch die Symbole
> bekannt.

Genau das scheint ja eben nicht der Fall zu sein. wenn der Header dank 
der guard defines nicht inkludiert wird, müssten ja auch alle anderen 
Symbole daraus bekannt sein. Inclusive der Funktionen, die ich verwenden 
möchten. Der Compiler spuckt aber z.B. das hier aus: "undefined 
reference to `osDelay'"

Johann L. schrieb:
> Das ist eine C++ Datei, vielleicht liegt da das Problem: Mischen von C
> und C++.

Wie würde ich dieses Problem beheben? Hatte bisher damit allerdings noch 
nie Probleme.

von Peter II (Gast)


Lesenswert?

Simon W. schrieb:
> Genau das scheint ja eben nicht der Fall zu sein. wenn der Header dank
> der guard defines nicht inkludiert wird, müssten ja auch alle anderen
> Symbole daraus bekannt sein. Inclusive der Funktionen, die ich verwenden
> möchten. Der Compiler spuckt aber z.B. das hier aus: "undefined
> reference to `osDelay'"

hättest du das mal gleich gesagt.

Das ist der Linker der sagt "undefined reference". Du hast vergessen die 
lib oder das object mit zu linke. Das ist keine Meldung vom compiler.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Johann L. schrieb:
> Das ist eine C++ Datei

Aber nur in besonders engstirnig konfigurierten Systemen, die nicht über 
den Tellerrand blicken können, und bewusst inkompatibel zum Rest der 
Welt sein wollen, in denen Groß- und Kleinschreibung im Dateisystem 
keinen Unterschied ausmacht.

Wer einen Compiler auf ein Betriebssystem portiert, das nicht zwischen 
Groß- und Kleinschreibung im Dateisytem unterscheidet, aber trotzdem *.C 
anders behandelt als *.c, der hat einen Programmierfehler produziert.

von Peter II (Gast)


Lesenswert?

Rufus Τ. F. schrieb:
> Wer einen Compiler auf ein Betriebssystem portiert, das nicht zwischen
> Groß- und Kleinschreibung im Dateisytem unterscheidet

welchen System soll das sein? Selbst unter Windows kann mit ein großes 
oder kleine C schreiben. Nur nicht gleichzeitig.

von Simon W. (simon1711)


Lesenswert?

Peter II schrieb:
> hättest du das mal gleich gesagt.
>
> Das ist der Linker der sagt "undefined reference". Du hast vergessen die
> lib oder das object mit zu linke. Das ist keine Meldung vom compiler.

Vielen Dank! Ich habs... ich war so auf die Include Geschichte fixiert!

Habe mir die Initialisierung mit CubeMX erstellt und nur, weil ich meine 
einzige Semaphore aus CubeMX entfernt habe, hat der schlaue Würfel wohl 
die CMSIS aus dem Linkerscript geworfen.
Nochmal erstellt und jetzt läuft alles.

Also bitte zurückspulen auf heute Morgen 8 Uhr.......

Danke euch allen!

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.