Hallo, ich programmiere den STM32F103C6T8 mit Eclipse(OpenSTM) in Cpp. Nun habe ich ein Cpp-Projekt erstellt und möchte in der Datei "stm32f10x_conf.h" eine Cpp-Header-Datei einbinden, z.B. "debug.hpp". Nun bekomme ich Compilerfehler wie z.B. unknown type bool, unknown type class, usw... Die typischen Fehler wenn man versucht in C Cpp einzubinden halt. Wenn ich aber debug.hpp erst in main.cpp einbinde funktioniert alles wie erwartet. Wie kriege ich die debug.hpp Datei schon in stm32f10x_conf.h eingebunden? Gruß
Versuche mal die stm32f10x_conf.h in .hpp umzubenennen. Alternativ kannst du evtl. im Makefile explizit g++ verwenden anstatt gcc (bzw. es gibt sicher auch ein Flag welches C++ ankündigt). Ich vermute, dass der Compiler beim lesen der stm32f10x_conf.h von C anstatt C++ ausgeht und dementsprechend auch dann deine debug.hpp als C behandelt
Du glaubst ernsthaft, dass da mitten im Übe setzen von C zu C++ und zurück gesprungen wird? Nene, er übersetzt C++, auch wenn die Datei .h heißt. Die ist nur offenbar kaputt. Wenn darin bool verwendet wird, muss der Header halt stdbool selbst einbinden.
Die Frage ist wohl eher, in was stm32f10x_conf.h eigentlich includiert ist. Denn ganz alleinstehend lässt die sich nicht kompilieren. Oliver
Nein, wenn der Header ordentlich inkludiert, was er braucht, muss uns das Drumrum nicht interessieren.
Dann kompiliert mal eine .h- Datei alleine... Zudem geht's hier tatsächlich um C/C++ Florian R. schrieb: > Nun bekomme ich Compilerfehler wie z.B. unknown type bool, unknown type > class, usw... Dafür brauchts keine Header, das ist C++ Sprachstandard. Oliver
Oliver S. schrieb: > Dann kompiliert mal eine .h- Datei alleine... Naja, dem Compiler ist die Dateiendung ziemlich schnuppe, es muss sich darin lediglich gültige C bzw. C++ Syntax befinden.
Oliver S. schrieb: > unknown type >> class ... ein C++-Compiler, der diese Fehlermeldung ausspuckt, ist keiner (sondern sehr wahrscheinlich eben ein C-Compiler, Ada wird's ja wohl nicht sein). Also wirst Du wohl herausfinden müssen, warum deine IDE (Makefile, Compile-Script, was auch immer Du da benutzt) die Übersetzungseinheit, die das betreffende File includiert, mit dem C- anstatt dem C++-Compiler verwurstet.
Florian R. schrieb: > Nun habe ich ein Cpp-Projekt erstellt und möchte in der Datei > "stm32f10x_conf.h" eine Cpp-Header-Datei einbinden, z.B. "debug.hpp". Das klingt so für sich schon sehr merkwürdig. Warum sollte man das wollen?
Die inkludierten Dateien werden nicht für sich alleine übersetzt. Vermutlich gibt es in Deinem Projekt eine C-Datei, die stm32f10x_conf.h inkludiert. Das könnte zum Beispiel Startup-Code sein, der standardmäßig in ein neues Projekt eingefügt wird. Aus den Fehlermeldungen des Compilers sollte hervorgehen, welche C/CPP-Datei er gerade übersetzt. Du könntest diese Datei dann von ".c" nach ".cpp" umbenennen, damit sie vom C++-Compiler statt vom C-Compiler übersetzt wird. Besser wärs aber, die mitgelieferten Dateien vom Hersteller nicht anzufassen, sondern eine eigene "main.h" o.ä. zu definieren, die Du in Deinen eigenen Code einbindest. Ansonsten machst Du Dir unnötige Probleme, wenn Du z.B. mal die Toolchain updaten oder das Projekt auf einen anderen Controller portieren möchtest.
Leider bin ich kein Informatiker und habe nur graue Vorahnung von was Ihr redet. Sorry. Ja, die stm32f10x_conf.h wird in vielen anderen Headern eingebunden, aber in keiner c Datei. Nur mein startup code besteht als letzte Fehlerquelle. Diesen verstehe ich eh nicht und bin froh, dass er das tut was er soll. Er ist dem Anhang beigefügt. Bestimmt findet Ihr die betreffende Zeile... Grund für das ganze: ich möchte in den ISRs Cpp verwenden. Ja ich muss die stm32f10x_it.c noch in .cpp abändern. Aber erstmal will ich nur mal erfolgreich includieren. Die Idee mit den Flags, da bin ich etwas unbeholfen. Ich pack mal das ganze, noch sinnfreie, Projekt in den Anhang. Wie Ihr sehen werdet, bin ich bis jetzt immer einen Umweg beim includieren gegangen. Eine c-Datei erstellt mit den Variablen für die ISR, dann erst eine Cpp-Datei um diese zu verarbeiten. z.B. bei i2c.c und I2Cdev.cpp Danke für die vielen Antworten Gruß
Florian R. schrieb: > Ja ich muss die stm32f10x_it.c > noch in .cpp abändern. Genau das wird es sein. GCC entscheidet die Programmiersprache nach Dateiendung und hier wird die stm32f10x_it als C kompiliert, welche wiederum den "stm32f10x_conf.h" Header als C interpretiert, welche wiederum deine debug.hpp als C interpretiert. Florian R. schrieb: > Eine c-Datei erstellt mit den Variablen für die > ISR, dann erst eine Cpp-Datei um diese zu verarbeiten. z.B. bei i2c.c > und I2Cdev.cpp Mal eine ganz andere Frage: Wieso nimmst du nicht durchgängig C++? Sonst hast du Probleme bei jeder Methode, die von C aus aufrufbar sein soll (Name Mangling, extern C als Präfix). Wenn es darum geht, dass der generierte Startup Code in C ist, dann mach einen einfachen Header mit
1 | extern C void cplusplus_startup(); |
und einer passenden start.cpp. In dieser machst du dann alles, was du vorher in den stm32 files gemacht hast. Dies hat, wie jemand schon erwähnt hat, den Vorteil, dass dein Code völlig unabhängig vom benötigten Board ist bzw. auch nicht überschrieben wird, wenn dieser mal geupdated werden würde.
Florian R. schrieb: > Ja, die stm32f10x_conf.h wird in vielen anderen Headern eingebunden, > aber in keiner c Datei. Natürlich wird die das, halt nicht direkt, sondern indirekt. Das ändert aber nichts daran, das gcc die Programmiersprache anhand der Endung der zu kompilierenden Datei festlegt. Und wenn die auf .c endet, dann ist das für gcc eine C-Datei, und es wird der C-Compiler aufgerufen. Der beschwert sich dann (zu Recht) über den C++-Code. Wie aber schon richtig bemerkt wurde, ist das wilde Durcheinander von C- und C++-Code eh suboptimal. Das passiert, wenn man einfach überall zusammengeklaubte Files in ein Projekt zusammenkopiert, aber suboptimal bleibt es trotzdem. Da wirst du etwas Hand anlegen müssen, und das alles glattziehen. Das es ebenfalls keine gute Idee ist, in Systemheadern herumzuändern, wurde auch schon gesagt. Das macht man nur aus sehr, sehr guten Gründen, du hast gar keinen. Oliver
:
Bearbeitet durch User
Es gibt aber zur stm32f10x_conf.h keine c-Datei also keine stm32f10x_conf.c ! Wieso also soll dann da der Fehler liegen? Die Header ohne c-Datei kann doch beides, c und cpp einbinden??? Hat den jemand mein Projekt angeschaut? Es geht um die Zeile 58 in stm32f10x_conf.h ...#include "Serial.hpp"... Erst heißt es, ich soll die StandardLib nicht abhändern, dann doch wieder alles in cpp umbennen? Die die c-Datei mit den ISRS ist noch rein c und ist auch richtig. SPÄTER werde ich diese abändern. Erstmal geht es rein um den Include-Fehler.
Die Datei mystd.h inkludiert besagte "stm32f10x_conf.h". mystd.c hingegen wird natürlich als C kompiliert, weshalb sowohl mystd.h als auch stm..._conf.h als C betrachtet werden. Da kannst du keine C++ Anweisungen benutzen. Ich sehe auch keinen Grund wieso die conf.h deine Header brauchen sollte? Der Header ist dazu da um Boardspezifische Funktionen bereitzustellen (z.B. stm32f10x_can.h) Das gehört alles in die main.cpp, in der es sich ja schon befindet. Warum hast du es also in die conf mit aufgenommen?
ok ich hab mein Projekt von unnötigen c Dateien bereiningt und alles in eine main.hpp umverlagert. Danke für die Tipps. Jetzt funktionierts!!! Gruß
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.