mikrocontroller.net

Forum: Compiler & IDEs Eclipse mit WinAVR


Autor: Bert Rachs (opalocca)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,
ich bin hier neu und dies ist mein erster Post.
Ich habe folgendes Problem.
Ich habe einige Tuts für Eclipse mit WinAVR gelesen und mir
Eclipse mit WinAVR eingerichtet, mit dem WinAVR-Plugin.
Ich möchte ein Programm kompilieren, das für den RP6 Robot gedacht ist:
#include "RP6RobotBaseLib.h"

int16_t main(void)
{
  initRobotBase();

  writeString_P("\n\n   _______________________\n");
  writeString_P("   \\| RP6  ROBOT SYSTEM |/\n");
  writeString_P("    \\_-_-_-_-_-_-_-_-_-_/\n\n");

  writeString_P("Hello World! My name is Robby!\n");
  writeString_P("Let's go! :)\n");

  setLEDs(0b111111);
  mSleep(1000);
  setLEDs(0b000000);
  mSleep(500);

  uint8_t runningLight = 1;

  while(true)
  {
    setLEDs(runningLight);
    runningLight <<= 1;
    if(runningLight > 32)
      runningLight = 1;
    mSleep(100);
  }
  return 0;
}

Das Kompilieren scheint zu klappen, aber ich glaube(bin nicht sicher), 
dass es mit dem Linker ein Problem gibt.
Dies ist die Fehlerausgabe:
make all 
Building file: ../main.c
Invoking: AVR Compiler
avr-gcc -I"E:\Devel\RP6Examples_20080915\RP6Examples_20080915\RP6Lib\RP6base" -I"E:\Devel\RP6Examples_20080915\RP6Examples_20080915\RP6Lib\RP6common" -I"E:\Devel\RP6Examples_20080915\RP6Examples_20080915\RP6Lib\RP6control" -Wall -Os -fpack-struct -fshort-enums -funsigned-char -funsigned-bitfields -mmcu=atmega16 -DF_CPU=8000000UL -MMD -MP -MF"main.d" -MT"main.d" -c -o"main.o" "../main.c"
Finished building: ../main.c
 
Building target: FirstTest.elf
Invoking: AVR C Linker
avr-gcc -Wl,-Map,FirstTest.map -mmcu=atmega16 -o"FirstTest.elf"  ./main.o   
./main.o: In function `main':
main.c:(.text+0x2): undefined reference to `initRobotBase'
main.c:(.text+0xa): undefined reference to `writeNStringP'
main.c:(.text+0x12): undefined reference to `writeNStringP'
main.c:(.text+0x1a): undefined reference to `writeNStringP'
main.c:(.text+0x22): undefined reference to `writeNStringP'
main.c:(.text+0x2a): undefined reference to `writeNStringP'
main.c:(.text+0x30): undefined reference to `setLEDs'
main.c:(.text+0x38): undefined reference to `mSleep'
main.c:(.text+0x3e): undefined reference to `setLEDs'
main.c:(.text+0x46): undefined reference to `mSleep'
main.c:(.text+0x4e): undefined reference to `setLEDs'
main.c:(.text+0x5e): undefined reference to `mSleep'
make: *** [FirstTest.elf] Error 1

Ich habe die Include-Dateien "RP6LibBase.h, RP6Common.h und RP6Control 
eingebunden, aber dennoch kann er mit in der Fehlerausgabe erscheinenden 
Begriffe nix anfangen...
Kann mir bitte jemand nen Tip geben was ich falsch mache?
Könnte es was damit zu tun haben, dass z.B. in der RP6ControlLib.h die 
Funktion "void mSleep(uint16t_t time)"... u.a. liegt? Also am 
"uint16_t"?
Und dass er nur "int" kennt?

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem ist, daß das Programm nicht nur aus der Datei main.c 
besteht.

Die .h-Dateien enthalten keinen Code, sondern nur die 
Funktionsprototypen. Dazu muß es auch noch .c-Dateien geben, die dann 
die eigentlichen Funktionen enthalten. Der Compiler merkt das nicht, 
aber der linker will alles zusammenbauen, und dem fehlt dann alles, was 
er mit "undefined reference" anmeckert.

Oliver

Autor: Bert Rachs (opalocca)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Antwort. Und wie mache ich denn dann die *.c-Dateien 
bekannt?
Die Include-Dateien hab ich ja als Pfad eingebunden, wie bekomme ich es 
hin, daß der Linker die Dateien findet?
Gruß, Bert.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Einfach links im Projekt hinzufügen. (z.B. durch 
rechtsclick/importieren) Da, wo jetzt schon main.c steht.

Voraussetzung ist natürlich, daß du die Dateien auf deinem Rechner hast.

Oliver

Autor: Bert Rachs (opalocca)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nochmal danke für die Antwort. Werde es gleich nach Feierabend 
ausprobieren und später kurz erzählen obs geklappt hat.
Gruß, Bert.

Autor: Bert Rachs (opalocca)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Leider, leider funktioniert es nicht. Wenn ich auf mein Projekt 
rechtsklicke und dann auf "Import" gehe, kommt ein Dialogfenster 
"Select", wo ich aufgefordert werde, eine Import-Quelle auszuwählen.
Ich gehe dann auf "C/C++-Executable" und im nächsten Fenster wähle ich 
dann meine *.c-Datei aus. Dann kommt aber die Fehlermeldung, dass diese 
Datei "is not a executable file" ist.
Mist, jetzt steh ich wieder am Anfang...
Vielleicht hat ja noch einer ne Idee.
Gruß, Bert.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ein "executable" ist eine .exe-Datei. Du willst aber eine Source-Datei 
hinzufügen. Ergo - passt nicht zusammen.

Wenn ich mich richtig erinnere, kannst du die Dateien auch direkt vom 
Explorer in das Projekt "rüberziehen".

Musst halt mal etwas rumprobieren.

Wenn gar nichts anderes hilft, leg mit "rechtklick/neu/..." eine neue 
Sourcedatei mit dem gleichen Namen an, und kopiere den Inhalt aus dem 
Original da rein.

Oliver

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Import über:
Genaral -> File System

Autor: Bert Rachs (opalocca)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Werde ich morgen vormittag ausprobieren und kurz Bericht erstatten.
Bis bald,
Gruß Bert.

Autor: John Schmitz (student)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

kann mir jemand in de Zwischenzeit sagen, wo der Vorteil von Eclipse 
gegenüber AvrStudio liegt ?

Nutze für Android Programmierung Eclipse, aber AVRStudio mit WINAVR an 
sich ist doch perfekt - oder ?

Grüsse

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Vorteil von Eclipse ist, dass es länger zum Laden braucht und mehr 
Ressourcen benötigt.

Oh, oops ;-)

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für den Anfang ist AVR-Studio schön und gut und sicherlich auch viel 
einfacher zum benutzen! (Eine komplette IDE inkl. Debugger und Emulator)

Für grössere bzw. komplexere Projekte bietet Eclipse jedoch tolle 
Programmier-Unterstützungen wie Code-Browsing, Syntax-Check, 
Auto-Completion etc... ist komplizierter zu benutzen, leider auch 
(unnötigerweise) unübersichtlich, aber trotzdem, alles in allem eine 
viel professionellere IDE.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ist es. Der AVR-Studio-Editor ist, na ja. Eclipse bietet da viel 
mehr. Nur debuggen ist ohne JTAG nicht möglich, da braucht es dann doch 
wieder das Studio, oder VMLAB.

Für die ersten Gehversuche ist das Studio daher mehr als ausreichend.

Oliver

Autor: Bert Rachs (opalocca)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe die Dateien über "Import->General->Filesystem", ins aktuelle 
Projekt hinzugefügt und die hinzugefügten Dateien werden zwar kompiliert 
aber es kommt folgende Fehlermeldung:
Building target: FirstTest.elf
Invoking: AVR C Linker
avr-gcc -Wl,-Map,FirstTest.map -mmcu=atmega32 -o"FirstTest.elf"  ./RP6ControlLib.o ./RP6I2CmasterTWI.o ./RP6I2CslaveTWI.o ./RP6RobotBaseLib.o ./RP6uart.o ./main.o   
./RP6I2CslaveTWI.o: In function `__vector_19':
RP6I2CslaveTWI.c:(.text+0x14): multiple definition of `__vector_19'
./RP6I2CmasterTWI.o:RP6I2CmasterTWI.c:(.text+0x5d6): first defined here
./RP6RobotBaseLib.o: In function `setLEDs':
RP6RobotBaseLib.c:(.text+0x7c): multiple definition of `setLEDs'
./RP6ControlLib.o:RP6ControlLib.c:(.text+0x2e6): first defined here
./RP6RobotBaseLib.o: In function `readADC':
RP6RobotBaseLib.c:(.text+0x122): multiple definition of `readADC'
./RP6ControlLib.o:RP6ControlLib.c:(.text+0x10e): first defined here
./RP6RobotBaseLib.o: In function `__vector_1':
RP6RobotBaseLib.c:(.text+0x1fe): multiple definition of `__vector_1'
./RP6ControlLib.o:RP6ControlLib.c:(.text+0xc): first defined here
./RP6RobotBaseLib.o: In function `__vector_2':
RP6RobotBaseLib.c:(.text+0x23e): multiple definition of `__vector_2'
./RP6ControlLib.o:RP6ControlLib.c:(.text+0x66): first defined here
./RP6RobotBaseLib.o: In function `__vector_3':
RP6RobotBaseLib.c:(.text+0x478): multiple definition of `__vector_3'
./RP6ControlLib.o:RP6ControlLib.c:(.text+0xc0): first defined here
./RP6RobotBaseLib.o: In function `__vector_10':
RP6RobotBaseLib.c:(.text+0x800): multiple definition of `__vector_10'
./RP6ControlLib.o:RP6ControlLib.c:(.text+0x68c): first defined here
./RP6RobotBaseLib.o: In function `sleep':
RP6RobotBaseLib.c:(.text+0xb8c): multiple definition of `sleep'
./RP6ControlLib.o:RP6ControlLib.c:(.text+0x818): first defined here
./RP6RobotBaseLib.o: In function `mSleep':
RP6RobotBaseLib.c:(.text+0xb9c): multiple definition of `mSleep'
./RP6ControlLib.o:RP6ControlLib.c:(.text+0x832): first defined here
./RP6RobotBaseLib.o: In function `delayCycles':
RP6RobotBaseLib.c:(.text+0xbb8): multiple definition of `delayCycles'
./RP6ControlLib.o:RP6ControlLib.c:(.text+0x850): first defined here
make: *** [FirstTest.elf] Error 1

Kann mir bitte jemand auf die Sprünge helfen?
An den hinzugefügten Dateien habe ich ja gar nichts verändert und ich 
habe mal versucht das gleiche Projekt mit "Programmers Notepad 2" zu 
bauen und das hat ohne Fehlermeldung hingehauen. Muß ich vielleicht noch 
irgendeine Einstellung an den Projekteigenschaften vornehmen?
Das ist doch merkwürdig, oder? Das es mit PN2 läuft und mit eclipse 
nicht...
Gruß Bert.

Autor: SF (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die RP6 Library baut auf einem komplexen makefile auf. Das kann man 
nicht so einfach in Eclipse übernehmen, indem man einfach nur das 
Filesystem importiert!

Im makefile sind die Pfade zu den RP6 Libraries/sourcen reinkodiert und 
eventuell noch andere für dieses Projekt spezifische Einstellungen.

Bei Sourcecode Projekten deren Aufbau man (noch) nicht versteht, ist es 
besser zuerst das mitgelieferte funktionierende makefile zu verwenden.

Du must dazu in Eclipse beim Anlegen eines neuen Projekts den Punkt 
"Makefile Projekt" auswählen. Dann übernimmt Eclipse das vorhandene 
makefile und kann den Code kompilieren.

Das Avr-Plugin für Eclipse wird in diesem Fall nicht benötigt und 
schadet nur, weil dieses versucht sein eigenes makefile zu erzeugen und 
damit das makefile von der RP6 Library kaputt schreibt.

Auf keinen Fall Eclipse das makefile automatisch verwalten/generieren 
lassen! Auch damit wird das makefile von der RP6 Library überschrieben!

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Noch einfacher wäre es, einfach mal nachzulesen, wie sich der Autor des 
Programms eigentlich das kompilieren gedacht hat. Hilfreich ist auch 
etwas Verständnis des fremden Projekts. Man wächst ja mit seinen 
Aufgaben, und da du anscheinend alle Aspekte von der Bedienung eines 
Compilers über den Aufbau eines makfiles bis hin zum Programmieren in C 
und den Spezialitäten der Mikrocontrollerprogrammierung gleichzeitig im 
Schnelldurchgang erlernen möchtest, musst du da jetzt durch. Obs klappt, 
ist noch offen.

Zum reinen kompileren und linken braucht es weder AVRStudio noch 
Eclipse. Wenn du ein passendes makefile hast, reicht ein einfaches 
"make" von der Kommandozeile.

Oliver

Autor: Bert Rachs (opalocca)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habs ENDLICH(!!) hinbekommen, dass Eclipse das Projekt kompiliert, 
linkt und alle nötigen *.o -, *.elf - Dateien, etc.. , erstellt.
War ja wirklich ne schwierige Geburt.
Im Makefile mußte ich einige Dinge anpassen.
Jetzt werde ich mich dranmachen AVR Dude einzurichten...
Gruß opalocca.

Autor: Thomas Holland (innot)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Im Gegensatz zu einigen Behauptungen hier kann man die RP6 Library sehr 
wohl ohne Makefiles und mit Eclipse benutzen.

Das Thema hatten wir auch schon mal und zwar hier: 
Beitrag "Re: Helpthread zum Wikiartikel AVR Eclipse"

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Im Gegensatz zu einigen Behauptungen hier kann man die RP6 Library sehr
>wohl ohne Makefiles und mit Eclipse benutzen.

Man kann jedes beliebige bestehende Nicht-Eclipse-Projekt ohne externe 
Makefiles mit Eclipse benutzen, wenn man die Projektstruktur verstanden 
hat, und die benötigten libs, source-Dateien, und Include-Pfade ins 
Eclipse-Projekt einträgt.

Das ist in der Regel sogar einfacher und sicherer, als mit externen 
makefiles rumzuhampeln.

Die einzige Voraussetzung ist das "wenn..." aus dem vorherigen 
Abschnitt.

Oliver

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.