Cross-Compiler einrichten

Aus PandoraWiki

Wechseln zu: Navigation, Suche

Inhaltsverzeichnis

Für Ubuntu

1. Crosscompiler installieren

1.1. Als Crosscompiler nutze ich den Lite-Compiler von CodeSourcery der unter folgender Adresse zu bekommen ist. Hier den IA32 GNU/Linux Installer herunterladen.

Sourcery G++ Lite 2009q3-67 for ARM GNU/Linux
http://www.codesourcery.com/sgpp/lite/arm/portal/release1039

Es gibt ein paar 'lite' Versionen welche kostenlos sind aber für manche muss man auch bezahlen (Quelle: Englisches PandoraWiki)

1.2. Als nächstes muss dieser Compiler noch installiert werden. Da Ubuntu Dash als Shell nutzt, der Installer von CodeSourcery aber nicht damit klar kommt, muss zuerst Dash als Standard-SHell abgelöst werden. Das erreicht man, indem man im Terminal den nachfolgenden Befehl eingibt.

 sudo dpkg-reconfigure -plow dash

Man gibt das aufgeforderte Admin-Passwort ein und wählt in dem angezeigten Shell-Dialog "Nein" aus.

1.3. Danach geht man in das Verzeichnis, in dem die heruntergeladene Bin liegt, und startet den grafischen Installations-Dialog. Und folgt den Anweisungen. Es brauch nichts besonders eingestellt werden. Einfach immer schön weiter klicken ;)

  ./arm-2009q3-67-arm-none-linux-gnueabi.bin

1.4. Jetzt setzt man nur noch den System-Pfad mit folgendem Befehlen.

  PATH=$HOME/CodeSourcery/Sourcery_G++_Lite/bin:$PATH
  export PATH

1.5. Jetzt sollte der einfache Aufruf von "arm-none-linux-gnueabi-g++" in der Konsole klappen.


2. Libraries und Includes für ARM-Angstrom

2.1.1 Jetzt benötigt man für den Crosscompiler noch die richtigen Libs. Die unter Angstrom auf einem ARM-System kompiliert wurden, bzw. mit einem Crosscompiler. Das ist die Grundvoraussetzung, damit das Compilieren funktioniert. Diese Libs bekommt man unter

http://www.angstrom-distribution.org/unstable/feed/armv7a/base/

2.1.2 Alternativ kann man sich wohl auch alle Libs, etc von der Pandora selbst holen, aber überspringen wir diesen Schritt einfach ;)

2.2. Auf dieser Seite suchen wir dann die Libs für SDL, SDL_image und für stdc++. Hierbei wird die Dev und die normale Version benötigt.

Folgende *.ipk Dateien herunterladen.

  • libstdc++-dev_4.3.3-r14.1.5_armv7a.ipk
  • libstdc++6_4.3.3-r14.1.5_armv7a.ipk
  • libsdl-1.2-0_1.2.14-r4.5_armv7a.ipk
  • libsdl-1.2-dev_1.2.14-r4.5_armv7a.ipk
  • libsdl-image-1.2-0_1.2.10-r5.1.5_armv7a.ipk
  • libsdl-image-1.2-dev_1.2.10-r5.1.5_armv7a.ipk

2.3. Nach dem Download öffnet man die Dateien mit dem Archivmanager (per GUI). Rechtsklick auf die Datei und auf "Mit Archivmanager öffnen" klicken.

Hier navigiert man dann folgendermaßen.
-> data.tar.gz
Öffnet ein neues Archivmanager-Fenster

-> .
Ja der Ordner heißt echt nur "." Darauf doppelt klicken.

Hier befindet sich de Ordner usr, den wir benötigen. Diesen entpacken wir zB in den Projekt-Ordner in dem sich unser SDL-Spiel befindet.


3. Compiler ausführen

3.1. Der wohl einfachste Schritt ;) Aber auch nur weil ich den Compiler schon etwas durch meine Arbeit mit dem Palm Pre kenne. Ich möchte den Schritt mal ein wenig genauer erläutern.

Eine kleine Vorschau über die Optionen des Compilers:
arm-none-linux-gnueabi-g++ DEVICEOPS -o OUTPUT SRC INCLUDEPATH LIBPATH -Wl,--allow-shlib-undefined USEDLIBS

arm-none-linux-gnueabi-g++
Das ist einfach der Aufruf des Compilers.

DEVICEOPS
Hier gibt man dem Compiler ein paar Infos über das Gerät, wofür das Executable erstellt werden soll. In unserem Fall wäre das "-mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp". Wie man sieht wird hier der Prozessor die FPU und allgemein die Handhabung mit Floatingpoints definiert. Genaueres steht in der Doku vom Compiler.

OUTPUT
Hierbei handelt es sich einfach nur um den Namen der Datei (Executable) die erzeugt werden soll. Als Beispiel nehmen wir hier "sdlgameengine"

SRC
An der Stelle von SRC werden alle *.cpp Dateien aufgelistet die für das Programm benötigt werden. Die Header-Dateien werden durch die *.cpp Dateien automatisch hinzugefügt. Also fügen wir hier "Window.cpp Image.cpp AnimatedImage.cpp Engine.cpp Controls.cpp main.cpp" ein.

INCLUDEPATH & LIBPATH
Damit der Compiler weiß wo sich die ganzen Libraries befinden gibt man an dieser Stelle die Ordner an die alle nötigen Dateien enthalten. Libraries gibt man mit dem Befehl -L an und Includes mit dem -I Befehl (großes i). Nach unserem Beispiel fügen wir hier "-Iusr/include/SDL -Lusr/lib" ein.

USEDLIBS
Zum Schluss fügt man nur noch die benötigten Libs an. Hier wäre "-lSDL -lSDL_image -lstdc++" die richtige Lösung. -lstdc++ fügt dabei libstdc++ an. Auch wenn der g++ Compiler schon die stdc++ automatisch einfügt, müssen wir hier anscheinend die eigene Lib nehmen, da sich sonst di Executable nicht auf der Pandora ausführen lässt. Standardmäßig wird wohl eine falsche Version eingebunden, daher dieser Schritt. Es kann sein dass di Reihenfolge der Libs wichtig ist. Also dass -lSDL vor -lSDL_image definiert werden muss.

3.2. Befehl anhand der oben genannten Infos erstellen. Dieser Befehl sieht dann folgendermaßen aus (in einer Zeile):

  arm-none-linux-gnueabi-g++ -mcpu=cortex-a8 -mfpu=neon -mfloat-abi=softfp -o sdlgameengine Window.cpp Image.cpp AnimatedImage.cpp Engine.cpp 
  Controls.cpp main.cpp -Iusr/include/SDL -Lusr/lib -Wl,--allow-shlib-undefined -lSDL -lSDL_image -lstdc++

3.3 Befehl ausführen Hier werden meistens Warnungen ausgegeben, die man soweit ignorieren kann. Meistens benötigt eine eingebundene Lib eine weitere Lib. Zum kompilieren sind diese Libs aber nicht notwendig. Der Befehl wird hier im Ordner ausgeführt, in dem sich die ganzen *.cpp Dateien und das usr/ Verzeichnis mit den Libs, etc aus den *.ipk Dateien befinden.

4. Executable und Ordner auf die Pandora kopieren

4.1. Jetzt sollte es im Verzeichnis in den man sich befindet eine ausführbare Datei names [b]"sdlgameengine"[/b] befinden. Diese Datei und der Content-Ordner werden jetzt auf die Pandora kopiert. Zum Beispiel ins Root der SD-Karte.

4.2. Als letztes kann man das Programm ausführen, indem man auf der Pandora einfach per Terminal in den Ordner von der Datei sdlgameengine navigiert. Und dort nachfolgendes eingibt.

  ./sdlgameengine