Forum: Compiler & IDEs AVR-GCC - C++ Anweisung: class


von Kermit (Gast)


Lesenswert?

Hallo,

ich möchte ein Opensource Programm, dass mit Arduino erstellt ist, in 
Eclipse kompilieren. Wenn es erst mal kompiliert, möchte ich es weiter 
auf meinem Controller anpassen. Ich habe die Arduino-Core librarys lokal 
eingefügt und includiert.

#include "wiring.h"
#include "HardwareSerial.h"

Das Problem ist, dass mit meiner Eclipse-Einstellung es wohl nicht 
möglich ist C++ Programme zu kompilieren?
Die ganzen Funktionen aus der wiring.h (alles C-programme) funktionieren 
einwandfrei.
Aber bei der HardwareSerial.h handelt es sich um C++ Programme. Und da 
meckert er - so vermute ich - die class-Anweisung an:

Invoking: AVR Compiler
avr-gcc -Wall -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char 
-funsigned-bitfields -mmcu=atmega644 -DF_CPU=20000000UL -MMD -MP 
-MF"main.d" -MT"main.d" -c -o"main.o" "../main.c"
In file included from ../HardwareSerial.h:25,
                 from ../main.c:61:
../Print.h:32: error: expected '=', ',', ';', 'asm' or '__attribute__' 
before 'Print'
In file included from ../main.c:61:
../HardwareSerial.h:29: error: expected '=', ',', ';', 'asm' or 
'__attribute__' before 'HardwareSerial'
../HardwareSerial.h:56: error: expected '=', ',', ';', 'asm' or 
'__attribute__' before 'Serial'


In den Zeilen steht:
Print.h:32:
class Print

HardwareSerial.h:29
class HardwareSerial : public Print

HardwareSerial.h:56
extern HardwareSerial Serial;

Print.cpp, HardwareSerial.cpp sind die einzigen, die .cpp als Endung 
haben.


Also wie stellt man den Compiler dazu richtig ein, bzw. welcher 
Parameter müsste er noch haben?


Danke im voraus,
Kermit (der keine Ahnung von C++ hat)

von (prx) A. K. (prx)


Lesenswert?

Nu kann aber ein C Compiler kein C++. Und die Endung .c steht für C. C++ 
wäre .C oder .cpp oder .cc.

von Niklas G. (erlkoenig) Benutzerseite


Lesenswert?

avr-gcc ist der C-Compiler. avr-g++ ist der C++ Compiler. Alternativ 
kannst du auch "avr-gcc -x c++" schreiben, dann ruft gcc den C++ 
Compiler auf. Vermutlich ist aber eher dein Problem, wie du Eclipse 
einstellen musst, damit es das richtige Kommando aufruft. Ich kenne 
Eclipse zwar nicht genauer, aber das geht vermutlich am einfachsten, in 
dem du die Datei, die du kompilierst - also deine main.c - zu einer C++ 
- Quell-Datei erklärst, vermutlich gibt es so etwas wie Datei -> Neu -> 
C++ - Quelldatei oder so, sodass Eclipse weiß, dass es den C++ Compiler 
aufrufen muss.

von Oliver (Gast)


Lesenswert?

Einfach Rechtsclick auf das Projekt, unter Properties/ C/C++-Build/ 
Settings/ AVR-Compiler "avr-g++" an Stelle von "avr-gcc" eintragen.

Oliver

von Kermit (Gast)


Lesenswert?

Danke, es hat geklappt! Nur das ich jetzt mehrere tausend Warnungen von 
Compiler erhalte. Es fängt z.B. schon damit an:
cc1plus: warning: command line option "-std=gnu99" is valid for C/ObjC 
but not for C++

von Oliver (Gast)


Lesenswert?

Die Optionen sind halt auch alle für C. Da musst du dich mal durch die 
Settings wühlen, und dort u.a. einen passenden Sprachstandard 
einstellen.

Oliver

von Kermit (Gast)


Lesenswert?

Ok, jetzt habe ich es geschafft, für jede Datei einzeln den compiler 
festzulegen. (rechte Maustaste auf das Sourcefile -> Properties -> C/C++ 
Build -> Tool Chain Editor -> Selct tool -> von NO TOOL auf den 
jeweiligen Compiler stellen. Wenn die Datei .c Endung hat, ist auch nur 
avr-gcc zur Auswahl und wenn die Datei .cpp Endung hat, ist nur avr-g++ 
zur Auswahl.

Das hat nun alles geklappt. Aber beim Linken gibt's Probleme. Ich habe 
auch schon probiert avr-g++ als Linker einzutragen, statt avr-gcc. 
Bringt aber auch nichts:

avr-g++ -Wl,-Map,13_OBDuino.map -mmcu=atmega644 -o"13_OBDuino.elf" 
./HardwareSerial.o ./Print.o ./WInterrupts.o ./main.o ./pins_arduino.o 
./wiring.o ./wiring_analog.o ./wiring_digital.o ./wiring_pulse.o 
./wiring_shift.o
./Print.o:(.data+0x6): undefined reference to `__cxa_pure_virtual'


Google sagt mir, dass das symbol wohl zur "libstdc++" gehört. Aber wie 
binde ich die ein?

von Kermit (Gast)


Lesenswert?

Beitrag "pure virtual???"

Da steht, dass es die nicht gibt und man eine Dummy-funktion einfügt. 
Jetzt linkt er auch fehlerfrei. Aber dafür passiert nun danach nichts 
mehr (kein hex-file)

make all
make: Für das Ziel »all« ist nichts zu tun.

Hm, irgendwie habe ich Eclipse jetzt wohl verkonfiguriert.

von Stefan E. (sternst)


Lesenswert?


von Oliver (Gast)


Lesenswert?

>Aber dafür passiert nun danach nichts
>mehr (kein hex-file)

Das ist zwar vermutlich ein Feature, und kein Bug, auch wenn ich den 
Sinn nicht verstehe, aber per default erzeugt das avr-plugin kein 
hex-file. Das muß man explizit in den Optionen auswählen.

Oliver

von Thomas H. (innot)


Lesenswert?

>>Aber dafür passiert nun danach nichts
>>mehr (kein hex-file)
>
> Das ist zwar vermutlich ein Feature, und kein Bug, auch wenn ich den
> Sinn nicht verstehe, aber per default erzeugt das avr-plugin kein
> hex-file. Das muß man explizit in den Optionen auswählen.

Ja, das sollte ein Feature sein. Per Default legt das AVR-Plugin zwei 
Konfigurationen an: 'Debug' und 'Release'. Als ich diesen Teil des 
AVR-Plugins geschrieben habe hatte ich noch nicht mal eine AVR Hardware 
und bin naiv davon ausgegangen, dass man zum debuggen eher einen 
Simulator benutzt und daher kein Hex braucht. Bisher hat sich aber noch 
niemand darüber beschwert, deswegen habe ich diesen Teil des Plugins 
auch nicht mehr angerührt.


Aber um auf die Probleme von Kermit zurückzukommen:
@Kermit
Du solltest ein C++ Project auch unbedingt als solches anlegen (New -> 
Project -> C++ Project).
C++ Projekte können auch C Sourcen enthalten (aber umgekehrt geht 
nicht).
Daher müssen auch die Fileextensions stimmen. Alle C++ Sourcefiles 
müssen mit '.cpp' bzw. '.cxx' enden damit Eclipse/CDT den Typ der Datei 
erkennen kann. 'main.c' wird immer als C source erkannt werden und 
entsprechend compiliert => also in 'main.cpp' umbennen.

Thomas

von Oliver (Gast)


Lesenswert?

Dazu gleich eine Frage:

Wäre es sinnvoll und möglich, bei C++-Projekten avr-g++ als Compiler 
vorzusehen?

Oliver

von (prx) A. K. (prx)


Lesenswert?

Warum einfach wenn's auch kompliziert geht. Wenn man den Files den 
richtigen Namen gibt ist alles in Butter, besteht keine Notwendigkeit, 
den Compiler zu irgendwas zu zwingen.

von Kermit (Gast)


Lesenswert?

Nachdem ich ein neues C++ Projekt angelegt habe und einfach alle Files 
rüberkopierte, erstellte Eclipse mir auch wieder ein .hex-File! Danke!

PS: Release setze ich immer sofort aktiv beim Anlegen des Projektes, wie 
es in jedem Tutorial steht. Wieso legt man das dann nicht als 
Standardeinstellung für neue Projekte fest?


Vielen Dank,
Kermit

von Thomas H. (innot)


Lesenswert?

> Wieso legt man das dann nicht als
> Standardeinstellung für neue Projekte fest?

a) weil noch keiner danach gefragt hat.

b) weil die so genannte 'Build Definition' ein sehr sensibler Teil des 
Plugins ist, bei dem eine unachtsame Änderung dazu führen könnte, dass 
alle Projekte, die mit früheren Versionen erstellt wurden, nicht mehr 
funktionieren. (In anderen Worten: ich scheue den Aufwand nur um 
einmalig 2-3 Mausklicks zu sparen)


Thomas

P.S. in welchen Tutorials steht, dass man immer 'Release' wählen sollte? 
(Bin nur neugierig, welche Tutorials es so zu meinem Plugin gibt)

von Kermit (Gast)


Lesenswert?

Also 'immer' steht da natürlich nicht. Ich habe dieses Tutorial 
http://www.wiki.elektronik-projekt.de/mikrocontroller/avr/avr_eclipse_tutorial 
zur Installation und Beginn mit einem einfachen "Hello Word" 
durchgearbeitet und kam relativ gut damit klar (Ein paar Dinge waren bei 
meinem Eclipse leicht anders) im Gegensatz zu dem Tutorial von hier: 
http://www.mikrocontroller.net/articles/AVR_Eclipse

Ich habe zuvor noch nie mit einer C-IDE gearbeitet (habe bisher 
vielleicht 1-2 kleine C-Grundlagenprogramme - natürlich nicht für 
Mikrocontroller - in meinem Leben geschrieben) und kenne bei weitem noch 
nicht alle (sinnvolle) Möglichkeiten von Eclipse. Ich finde noch 
jedesmal intuitiv was neues an Eclipse und bis jetzt komme ich relativ 
gut damit klar. Habe aber natürlich auch keine anderen Erfahrungen zum 
Vergleich. Bisher habe ich nur PICs in Assembler mit PiKdev 
probgrammiert. Da ich nun was mit komplexeren Rechnung/Formatierungen 
vor habe und da es den gcc leider nicht für PICs gibt, probiere ich nun 
ein bisschen mit den AVRs rum.

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.