STM Cube IDE - Compiler für C++ einstellen

OP #7730115
Lesenswert?

Hallo zusammen,

ich möchte mein Projekt mit C++ in der Cube IDE programmieren. Leider scheint der Compiler das noch nicht ganz verstanden zu haben. Beim Erstellen des Projekts habe ich natürlich auch C++ ausgewählt. Ich habe dann eine Klasse erstellt worauf eine .cpp und eine .h File generiert wurden. Beim Kompilieren kommt dann der Fehler "../Core/Src/Klasse.h:11:1: unknown type name 'class'". Das kann ich mir nur dadurch erklären, dass die Header File aus irgendwelchen Gründen mit gcc und nicht mit g++ kompiliert wird. Wie kann ich einstellen, dass das mit g++ kompiliert werden soll und warum passiert das nicht automatisch, wenn ich ein C++ Projekt erstelle?

(Firma: Torrox.de) #7730117
Lesenswert?

Alex schrieb:

Hallo zusammen,

ich möchte mein Projekt mit C++ in der Cube IDE programmieren. Leider scheint der Compiler das noch nicht ganz verstanden zu haben. Beim Erstellen des Projekts habe ich natürlich auch C++ ausgewählt. Ich habe dann eine Klasse erstellt worauf eine .cpp und eine .h File generiert wurden. Beim Kompilieren kommt dann der Fehler "../Core/Src/Klasse.h:11:1: unknown type name 'class'". Das kann ich mir nur dadurch erklären, dass die Header File aus irgendwelchen Gründen mit gcc und nicht mit g++ kompiliert wird. Wie kann ich einstellen, dass das mit g++ kompiliert werden soll und warum passiert das nicht automatisch, wenn ich ein C++ Projekt erstelle?

Cube, ist doch wahrscheinlich auch nur wieder ein Eclipse mit CDT. Du kannst Dir doch sicher den Aufruf (die Kommandozeile) des Compilers in irgend einem Fenster angucken und dort sehen:

  • Welche Datei wurde überhaupt übersetzt (Vielleicht war es ja sogar eine C Datei)?
  • Welcher Compiler wurde überhaupt aufgerufen.
  • Mit welchen Optionen wurde der Compiler aufgerufen.
OP #7730120
Lesenswert?

Ja das stimmt, ich habe die Klasse in main.c eingebunden. Eigentlich hätte ich main auch gerne mit g++ kompiliert, da ich die Klasse natürlich auch verwenden will. Im Internet wird oft empfohlen, main.c einfach in main.cpp umzubennen, aber erstens wird das jedes mal beim code generieren überschrieben und zweitens bekomm ich damit irgendeinen Makefile error.

OP #7730122
Lesenswert?

Torsten R. schrieb:

[...]

  • Welche Datei wurde überhaupt übersetzt (Vielleicht war es ja sogar eine C Datei)?
  • Welcher Compiler wurde überhaupt aufgerufen.
  • Mit welchen Optionen wurde der Compiler aufgerufen.

Wenn ich den Output richtig interpretiere, dann wurde versucht Klasse.h mit gcc zu kompilieren. Aber ich kann's dir schnell reinkopieren: arm-none-eabi-gcc "../Core/Src/main.c" -mcpu=cortex-m0plus -std=gnu11 -g3 -DDEBUG -DUSE_HAL_DRIVER -DSTM32L053xx -c -I../Core/Inc -I../Drivers/STM32L0xx_HAL_Driver/Inc -I../Drivers/STM32L0xx_HAL_Driver/Inc/Legacy -I../Drivers/CMSIS/Device/ST/STM32L0xx/Include -I../Drivers/CMSIS/Include -O0 -ffunction-sections -fdata-sections -Wall -fstack-usage -fcyclomatic-complexity -MMD -MP -MF"Core/Src/main.d" -MT"Core/Src/main.o" --specs=nano.specs -mfloat-abi=soft -mthumb -o "Core/Src/main.o" In file included from ../Core/Src/main.c:24: ../Core/Src/Klasse.h:11:1: error: unknown type name 'class' 11 | class Klasse { | ^~~~~

(Firma: Torrox.de) #7730125
Lesenswert?

Alex schrieb:

Wenn ich den Output richtig interpretiere, dann wurde versucht Klasse.h mit gcc zu kompilieren. Aber ich kann's dir schnell reinkopieren: arm-none-eabi-gcc "../Core/Src/main.c" -mcpu=cortex-m0plus -std=gnu11 -g3 -DDEBUG -DUSE_HAL_DRIVER -DSTM32L053xx -c -I../Core/Inc -I../Drivers/STM32L0xx_HAL_Driver/Inc -I../Drivers/STM32L0xx_HAL_Driver/Inc/Legacy -I../Drivers/CMSIS/Device/ST/STM32L0xx/Include -I../Drivers/CMSIS/Include -O0 -ffunction-sections -fdata-sections -Wall -fstack-usage -fcyclomatic-complexity -MMD -MP -MF"Core/Src/main.d" -MT"Core/Src/main.o" --specs=nano.specs -mfloat-abi=soft -mthumb -o "Core/Src/main.o" In file included from ../Core/Src/main.c:24: ../Core/Src/Klasse.h:11:1: error: unknown type name 'class' 11 | class Klasse { | ^~~~~

Nicht ganz: "../Core/Src/main.c" wird übersetzt. Dabei wird dann anhand der Dateiendung vermutet, dass es sich dabei um C handelt. In Zeile 24 steht dann ein "#include "Klasse.h". Der Inhalt der Datei wird an dieser Stelle eingefügt und der C Compiler stolpert dann über die C++ Sprachkonstrukte.

(Firma: Torrox.de) #7730143
Lesenswert?

Alex schrieb:

Ah vielen Dank für die Erklärung. Dann sollte meine Frage wohl sein, wie ich dafür sorgen kann, dass main.c als cpp behandelt wird. Oder soll ich alles in einer eigenen .cpp file programmieren und die dann von main.c aufrufen?

Ich würde main.c in main.cpp umbenennen (und Klasse.h in klasse.hpp), damit klar ist, welche Datei in welcher Sprache geschrieben ist.

Deine IDE kann evtl. die Makefiles nicht on the fly anpassen, wenn Du eine Datei umbenennst. Versuch doch mal, die Datei aus der Liste der zu übersetzenden Dateien zu entfernen, umzubennen und anschließend wieder hinzu zu fügen.

Wenn der Code-Generator Dir die Datei immer wieder überschreibt, dann müsste man ggf. vielleicht die Code-Generierung anpassen.

Ansonsten kann man dem Compiler auch explizit sagen, welche Sprache in einer Datei verwendet wird (üblicherweise, in dem man g++ und nicht gcc verwendet).

Persönliche Seite #7730145
Lesenswert?

Alex schrieb:

Ah vielen Dank für die Erklärung. Dann sollte meine Frage wohl sein, wie ich dafür sorgen kann, dass main.c als cpp behandelt wird.

Geht in der STM32CubeIDE nicht. Man muss die main.c nach main.cpp umbenennen, und wenn man den Codegenerator laufen lassen will wieder zurück nach .c umbenennen und danach wieder nach .cpp ...

Alex schrieb:

Oder soll ich alles in einer eigenen .cpp file programmieren

Klassen gehören sowieso in separate Dateien. Um das Umbenennen zu vermeiden kannst du alle Aufrufe von der main in C++ Files delegieren (über den Aufruf globaler Funktionen statt die Klassen direkt zu nutzen).

#7730166
Lesenswert?

Ich habe mein Projekt von einem externen Entwickler bekommen, da waren mehrere Stellen drin die im Code in Kommentaren markiert waren und geändert werden mussten. Nach jeder Codegenerierung. Sowas nervt, ist fehlerträchtig und ein No Go. Zum Glück hat CubeMX Eingriffsmöglichkeiten, aber zum Teil aufwändig weil erst Caller von zu ändernden Funktionen geändert werden müssen. Wenn da so eine Automatik drin ist, dann will ich die nicht manuell überschreiben müssen. Und auch keine Dateien umbenennen wollen.

#7730798
Lesenswert?

Wie schon erwähnt wurde (ist ein alter Hut):

Eine my_main.h (oder hpp, je nach Gusto) mit einer Funktion

extern "C" void my_main(void)

deklarieren und diese my_main.hpp in main.c inkludieren. In main.c dann my_main() aufrufen. In my_main.cpp kann man sich dann in der Funktion my_main() in C++ austoben. In my_main() steht dann praktisch das Hauptprogramm.

Hintergrund ist, daß die Cube immer eine main.c generiert. Also immer nur C-Code generiert.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren