GCC und EM-Blocks - kann Standard-Header nicht einbinden?

#3930140
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??
#3930150
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.
#3930553
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*)'|
Gast #3930602
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.
#3930924
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?

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