Forum: Mikrocontroller und Digitale Elektronik GCC und EM-Blocks - kann Standard-Header nicht einbinden?


von Daniel F. (franken_3)


Lesenswert?

Hi, ich habe ein merkwürdiges Problem.

Wenn ich in meinem STM32 Projekt (EM_Blocks) mit GCC mein C++ Projekt in 
einzelne Datein zerlegen will, geht das auch erstmal.

Nur wenn ich in meinen selbst erstellten Header-Files Stantdard-Header 
z.B #inlcude <vektor>
oder
#inlcude <iostream>
einbinden will, dann bekomme ich einen Compiler-Fehler. Er kann die 
Datein nicht finden.

Kopiere ich aber den selben Code direkt in eine .cpp Datei dann wird das 
Programm problemlos übersetzt???

Weiß jemand vielleicht was da los ist? Muss man da noch irgendwelche 
Einstellungen vornehmen?

Danke schonmal, weiß gerade nicht was ich machen soll.


PS: Habe schon versucht auch die Header in den Ordner src wo die .cpp 
Datein liegen zu kopieren. Funktioniert leider trotzdem nicht??

von holger (Gast)


Lesenswert?

#inlcude <iostream>

Was soll das denn sein?

von Sebastian V. (sebi_s)


Lesenswert?

Dein Problem ist komisch und sollte so nicht auftreten. Alles was ein 
include macht ist ja nur den Text aus der entsprechenden Datei dort 
einzufügen wo das include steht. Es sollte also keinen Unterschied 
machen ob die includes für die Standardlibrary in deinen Headern steht 
oder in der .cpp Datei. Da deine Beispiele von oben aber voller 
Tippfehler sind poste doch mal bitte die tatsächlichen Dateien.

von NurEinGast (Gast)


Lesenswert?

Oft hilft es die genaue Fehlermeldung zu posten statt "kommt ein 
Fehler".

Zeig mal deine Include Datei. Wahrscheinlich ist da ein #ifdef drin.

von Daniel F. (franken_3)


Lesenswert?

Hallo,

ja das mit dem <Vektor> statt <Vector> passiert mir des öftern mal.

Sorry

Also ich habe hier folgende Fehlerausgabe mit

#include <vector>
#include <algorithm>


C:\Users\Eckert\Documents\yC\SensorBox++\src\main.cpp:63||undefined 
reference to `__cxa_end_cleanup'|

und

obj\release\src\main.o:(.ARM.extab.text.startup.main+0x0)||undefined 
reference to `__gxx_personality_v0'|

Wenn ich mit #include <iostream> arbeite kommt folgende Meldung dazu

c:\program files 
(x86)\emblocks\2.30\share\em_armgcc\bin\..\lib\gcc\arm-none-eabi\4.7.3\. 
.\..\..\..\arm-none-eabi\include\c++\4.7.3\iostream:75||undefined 
reference to `std::ios_base::Init::Init()'|

Denke mal, dass ich die iostream Bib nicht brauche, habe hier ja kein 
sdin/stdout oder?

Danke schon mal für eure Hilfe.

Gruß


PS: Wenn ich versuche ein Objekt dynamisch zu erzeugen kommt folgendes 
Hinzu:

CEncoder *ptrEncoder = new CEncoder(GPIOA, GPIO_Pin_4, GPIOB, 
GPIO_Pin_5);

ergibt:

C:\Users\Eckert\Documents\yC\SensorBox++\src\main.cpp:51||undefined 
reference to `operator new(unsigned int)'|

C:\Users\Eckert\Documents\yC\SensorBox++\src\main.cpp:51||undefined 
reference to `operator delete(void*)'|

von Student (Gast)


Lesenswert?

Es gibt keine C++ Standard Library (zumindest ist keine mitgeliefert, 
vielleicht gibt es sie mittlerweile irgendwo).
Siehe Beitrag "STM32 C++ Toolchain"

von Dr. Sommer (Gast)


Lesenswert?

Student schrieb:
> Es gibt keine C++ Standard Library (zumindest ist keine
> mitgeliefert,
> vielleicht gibt es sie mittlerweile irgendwo).
Und was ist dann das da:
http://de.wikipedia.org/wiki/C%2B%2B-Standardbibliothek

Und die ist, oh Wunder, auch beim GCC für Cortex-M mitgeliefert.

Daniel Eck schrieb:
> PS: Wenn ich versuche ein Objekt dynamisch zu erzeugen kommt folgendes
> Hinzu:
Bist du sicher dass du dynamischen Speicher verwenden willst? Wie viel 
RAM hast du zur Verfügung?
Wenn du das willst, musst du malloc entsprechend konfigurieren (Bereich 
im Linkerscript zuweisen etc).

Deine Fehler sind keine include-Fehler, die Header werden sehr wohl 
gefunden. Du musst aber mit der C++ Standard Library auch linken. Das 
geht, indem du mit "g++" statt "gcc" linkst. Wenn du direkt mit "ld" 
linkst, versuche mal "-lstdc++" zu übergeben.

Was soll <iostream> auf einem Mikrocontroller? Da hast du kein std::cout 
etc.

von Daniel F. (franken_3)


Lesenswert?

Hi, OK dynamischer Speicher muss nicht sein bzw. könnte auch mit 
malloc() umgesetzt werden.

Ich habe nun schon öfter gehört, das ich g++ verwenden soll, aber wie? 
Ich habe den gcc in der IDE integriert geliefert bekommen und habe 
bisher auch keine Option gefunden einen anderen zu wählen?

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.