ac6 Compiler Include Reihenfolge Verständnisfrage!

OP #5113939
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
Gast #5113945
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.
Persönliche Seite #5113973
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++.
OP #5114039
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.
Gast #5114042
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.
Persönliche Seite #5114048
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.
Gast #5114049
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.
OP #5114123
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!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.