www.mikrocontroller.net

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


Autor: Kermit (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Niklas Gürtler (erlkoenig)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oliver (Gast)
Datum:

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

Oliver

Autor: Kermit (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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++

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kermit (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Kermit (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielleicht für dich interessant:
http://www.avrfreaks.net/index.php?name=PNphpBB2&f...

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Holland (innot)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dazu gleich eine Frage:

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

Oliver

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Kermit (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Thomas Holland (innot)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Kermit (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also 'immer' steht da natürlich nicht. Ich habe dieses Tutorial 
http://www.wiki.elektronik-projekt.de/mikrocontrol... 
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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.