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ß!!