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)
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.
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++
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
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?
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.
>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
>>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
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.
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
> 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)
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.