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)
Nu kann aber ein C Compiler kein C++. Und die Endung .c steht für C. C++ wäre .C oder .cpp oder .cc.
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.
Einfach Rechtsclick auf das Projekt, unter Properties/ C/C++-Build/ Settings/ AVR-Compiler "avr-g++" an Stelle von "avr-gcc" eintragen. Oliver
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.
Vielleicht für dich interessant: http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=59453
>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
Dazu gleich eine Frage: Wäre es sinnvoll und möglich, bei C++-Projekten avr-g++ als Compiler vorzusehen? Oliver
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.