Dienstag, 2 Feb, 2010

SDL-Programme auf dem WIZ

Um ein Programm für den WIZ zu übersetzen bedarf es einige Vorbereitung.

Ich beschreibe hier wie man ein SDL-Programm in der Kommandozeile erstellt. Wenn ihr einen Editor verwendet müsst ihr noch die Einstellungen für einen Crosscompiler vornehmen.

Asl esrtes brauchen wir die ToolChain. Wir verwenden aber nicht die aus dem Archiv weil wir zu dieser noch die fehlenden Libs hinzufügen müssten (siehe englische Wiki: www.gp2xwiz.co.uk ).

Torpor aus dem englischen Forum hat uns das schon abgenommen und eine ToolChain mit den benötigten Libs erstellt (http://www.gp32x.com/board/index.php?/topic/48635-a-slightly-more-complete-toolchain-libs-for-linux-devs/).

Los geht es:

ToolChain herunter laden:

wget http://w1xer.de/toolchain-arm-openwiz-linux-gnu.tar.gz

nach /opt kopieren:

cp toolchain-arm-openwiz-linux-gnu.tar.gz /opt

Paket entpacken:

sudo cd /opt
sudo tar xzf toolchain-arm-openwiz-linux-gnu.tar.gz

Jetzt erstellen wir ein Test programm, point.cpp (genau das macht das Programm auch es zeichnet einen kleinen Punkt):

#include "SDL.h"
	
#define SCREEN_WIDTH 320
#define SCREEN_HEIGHT 240
#define SCREEN_DEPTH 8
	
int main(int argc, char *argv[]) {
     SDL_Surface *screen;
     Uint8       *p;
     int         x = 10; //x coordinate of our pixel
     int         y = 20; //y coordinate of our pixel
	
     /* Initialize SDL */
     SDL_Init(SDL_INIT_VIDEO);
	
     /* Initialize the screen / window */
     screen = SDL_SetVideoMode(SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_DEPTH, SDL_SWSURFACE);
	
     /* Make p point to the place we want to draw the pixel */
     p = (Uint8 *)screen->pixels + y * screen->pitch + x * screen->format->BytesPerPixel;
	
     /* Draw the pixel! */
     *p=0xff;
	
     /* update the screen (aka double buffering) */
     SDL_Flip(screen);
     while(1);
}

Jetzt brauchen wir ein Makefile, was dem Make sagt das wir den Crosscompiler nutzen soll:

# Project: TestSDL
	
ARMDIR    = /opt/arm-openwiz-linux-gnu
CPP       = $(ARMDIR)/bin/arm-openwiz-linux-gnu-c++
OBJ       = point.cpp
LIBS      = -L$(ARMDIR)/lib -Wl,-rpath,$(ARMDIR)/lib -lSDL -lSDL_ttf -lSDL_mixer -lm -lz -lpng -lSDL_image -liconv -lfreetype -lmad -lvorbisidec
INCS      = -I$(ARMDIR)/include/ -I$(ARMDIR)/include/SDL
BIN       = point.gpe
DEFINES   = -DWIZ
CXXFLAGS  = $(INCS) $(DEFINES) -fno-rtti -fno-exceptions -fno-pcc-struct-return -fstrict-aliasing -O2
	
all: $(OBJ)
        $(CPP) $(CXXFLAGS) point.cpp -o $(BIN) $(LIBS)

Nun ist es soweit:

make

Das sollte ohne Fehler ablaufen.

Damit wir das jetzt auf dem WIZ starten können müssen wir noch eine Kleinigkeit mache. Wenn wir das jetzt so ausführen gibt es auf dem WIZ folgenden Fehler:

./point.gpe: error while loading shared libraries: 
libiconv.so.2: cannot open shared object file: No such file or directory

Nun haben wir zwei möglichkeiten:

1. Wir kopieren die libiconv.so.2 (/opt/arm-openwiz-linux-gnu/lib/libiconv.so.2) in das /lib Verzeichnis auf dem NAND.

2. Wir erstellen eine point-start.gpe Datei die wiefolgt aussieht:

#!/bin/sh
	
LD_LIBRARY_PATH=.;$LD_LIBRARY_PATH
./point.gpe
	
sync
cd /usr/gp2x
exec /usr/gp2x/gp2xmenu

Nun kopieren wir die point.gpe, die point-start.gpe und die libiconv.so.2 in ein Verzeichnis auf den WIZ (oder SD-Karte).

Nun könnt ihr auf dem WIZ einen Punkt sehen, toll oder :-D.

Wenn ihr nun ein Programm schreibt, was auch einmal endet :D, dann wollt ihr sicherlich auch das nach dem Beenden das Menu wieder erscheint. Dafür müsst ihr eurem Programm folgendes Include hinzufügen :

#include <unistd.h>

und vor dem Beenden eures Programmes, das Menu auf rufen:

#ifdef GP2X
    chdir("/usr/gp2x");
    execl("/usr/gp2x/gp2xmenu", "/usr/gp2x/gp2xmenu", NULL);
#endif 

So und nun viel Spaß!!