HW SDL verwenden und statisch binden


KidPaddle

Very Active Member
Joined
May 14, 2006
Messages
491
Location
Germany
Hallo,

ich habe gerade versucht gegen die HW-SDL von Paeryn zu linken und bekomme z. B. folgende Meldung " C:/GP2XSDK/Tools/arm-gp2x-linux/lib/libstdc++.so uses hardware FP, whereas stransball2.gpe uses software FP "

Wenn ich die normalen SDL Libraries aus dem aktuelle SDK verwende, geht es ohne Probleme. Ich möchte die ToolChain aber nicht ändern, da bisher alles andere damit problemlos funktioniert. Da bei dem aktuelle Projekt, Super Transball 2, sehr viele SDL_BlitSurface - Aufrufe erfolgen, möchte ich die HW-Version einbinden, damit das Spiel flüssiger läuft.

Und wie kann ich eine Libarary statisch einbinden, so daß diese auf dem GP2X nicht installiert werden muß.

Gruß
Thomas
 
Hi

Späte antwort, aber besser als nie.

Habe gestern Abend das selbe probiert um Descent 2 gegen Paeryn's SDL Library zu linken. Selbes Ergebnis wie du.

Dann habe ich mir gedacht ich kompiliere seinen gesamten SDL Code, mit Hilfe der GP2X Toolchain.
Das hats gebracht. Die SDL Library die dabei herauskam konnte ich dann statisch gegen den Descent 2 code linken und es ist wirklich um längen schneller.

Der link Aufruf sieht dann ungefähr so

zb LDFLAGS= -lSDL -lSDL_image -lptherad
änderst du in
LDFLAGDS=/gp2xsdk/Tools/paeryn/lib/libSDL.a -lSDL_image -lpthread


Die SDL LIB kompiliert man für den GP2X ungefähr so.

CC=/gp2xsdk/Tools/arm-gp2x-linux/bin/gcc ./configure --disable-shared && make

Hoffe das hilft.

Gruss
 
Kannst Du mir die kompilierten Bibliotheken für SDL bereistellen? Da ich unter Windows arbeite, kann ich die SDL nicht so einfach erstellen. Ich müste eine Cygwin - Umgebung aufsetzen und das möchte ich zur Zeit nicht.

Gruß
Thomas
 
leider zu spät

<r>Hi<br/>
<br/>
Hätte ich machen können, das jetzt ein wenig doof ist, da ich sie nicht mehr habe.<br/>
Ich setzte jetzt nicht mehr das offizielle SDK sondern das von Opoo ein.<br/>
Da ist HW SDL direkt mit dabei.<br/>
Schau mal ob die für Win32 auch bereit steht.Ansonsten, wie von dir bereits angedeutet, Cygwin nutzen. <E>:-(</E> <br/>
<br/>
Aber abgesehen davon. Ich hab jetzt mal ein wenig getestet. Ich portiere zur Zeit Descent 2 auf den GP2X. Ich hab auch mein älters Projekt (Airstrike) mal gegen die HW SDL gelinkt und ich hab das Gefühl, das seit dem die HW SDL dabei ist, die Grafik und der Sound nicht mehr in Sync sind. Dies ist bei beiden Spielen der Fall. <br/>
<br/>
Also, wenn ich dir nen Tipp geben darf. Falls du ein/e Spiel / Applikation schreibst welche nicht so viele Ressourcen braucht, würde ich es erstmal mit der "normalen" SDL die beim offizielen SDK dabei ist probieren, oder <br/>
falls dein Projekt noch nicht so weit gediehen ist , das du direkt auf dem Framebuffer schreibst. Das ist auch sehr sehr schnell. Ryleh's minilib wäre dazu perfekt geeignet.<br/>
<br/>
Gruß<br/>
Anes<br/>
<br/>
PS: Du müsstest aber auch unter Win32 die SDL Cross Kompilieren können.<br/>
Dazu am besten mal auf irc.freenode.org #sdl mit den Jungs chatten.</r>
 
So, habe mir jetzt mit Hilfe von coLinux ein Debian 3.1 unter XP Home aufgesetzt, innerhalb des coLinux das SDK von GHP installiert und die Payern's SDL kompiliert. Das hat sehr gut funktioniert und nun habe ich eine libSDL.a.

Dies war der Linux - Part. Nun zu DevCPP.

Wenn ich nun im DevCPP folgende Linker - Parameter angebe
Code:
-static 
-lSDL 
-lSDL_mixer 
-lSDL_ttf 
-lSDL_image 
-lvorbisidec 
-lfreetype 
-ljpeg 
-lpng12 
-lz 
-lm 
-lpthread
dann hagelt es nur von nicht aufgelösten Refernezen, in der Art:
Code:
  [Linker error] undefined reference to `SDL_ReadBE16' 
  [Linker error] undefined reference to `SDL_ReadLE32' 
  [Linker error] undefined reference to `SDL_MixAudio' 
  [Linker error] undefined reference to `SDL_LoadWAV_RW' 
  [Linker error] undefined reference to `SDL_FreeWAV'

Ohne die Angabe von "-static" wird alles ohne Probleme erzeugt.

Was fehlt mir noch?

Gruß
Thomas
 
Es fehlt nichts meiner Meinung nach.
Häng mal -lSDL ans Ende, oder füg am Ende noch eins an.

Gruß
 
War bei Windows bzw. DevCPP nicht irgendwas mit "-SDLmain" oder so in dem Dreh von nöten ?
 
Das -lSDL ans Ende verschieben hat es gebracht. Ist das ein Bug in DevCPP, oder warum sollte die Reihenfolge der einzubindenen Libraries eine Effekt darauf haben?

Vielen Dank für den Tipp.

Gruß
Thomas
 
KidPaddle said:
Das -lSDL ans Ende verschieben hat es gebracht. Ist das ein Bug in DevCPP, oder warum sollte die Reihenfolge der einzubindenen Libraries eine Effekt darauf haben?

Vielen Dank für den Tipp.

Gruß
Thomas

Das ist kein Bug, sondern liegt daran, dass der Linker in dem Moment, wo er alle Dateien zusammenlinkt, für jeden Funktionsaufruf die passende Funktion ins Binary linken muss. Dabei geht er in der Reihenfolge vor, wie die Libraries im Linkeraufruf angegeben sind. Wenn jetzt eine Library, die eine Funktion aus einer anderen braucht, vor dieser angegeben wurde, kommt es zu dem von dir beschriebenen Fehler, weil die benötigte Funktion zu dem Zeitpunkt noch nicht zur Verfügung steht.

Beim dynamischen Linken tritt der Fehler nicht auf, weil die Funktionen eh erst später dynamisch zur Laufzeit geladen werden.
 
Aha. Aber müßte dann die SDL nicht am Anfang stehen, oder geht der Linker von hinten nach vorne vor?

Thomas
 
KidPaddle said:
Aha. Aber müßte dann die SDL nicht am Anfang stehen, oder geht der Linker von hinten nach vorne vor?

Ja genau, es wird von hinten angefangen.
 
Vielen Dank für die Info. Nun taucht das nächste Problem auf. Alles wird erstellt, der Aufruf von SDL_SetVideoMode und SDL_CreateRGBSurface funktioniert problemlos.

Als nächstes wird Mix_OpenAudio(22050, AUDIO_S16, 2, 1024) aufgerufen und es crasht innerhalb von SDL. Tja, nun geht die Suche weiter.

Gruß
Thomas
 
Audio

<t>Hi<br/>
<br/>
Danke für die Info das das von hinten nach vorne aufgelöst wird. Das wusste ich nicht, und erklärt das verhalten somit.<br/>
<br/>
Kidpaddle: Ich denke du musst bei SDL_Init zusätzlich | SDL_INIT_AUDIO angeben. dann sollte es gehen.<br/>
<br/>
Viel erfolg.<br/>
<br/>
Gruß</t>
 
SDL_INIT_AUDIO wird bei der Initialisierung mit angegeben. Das Programm funktioniert mit dynamischen binden gegen die normale GPH SDL tadellos, Musik bzw. Soundeffekte funktionieren, nur geht die FPS so auf 12-20 zurück, wenn zuviele Sprites gleichzeitig angezeigt werden.

Beim statischen linken gegen die normale oder Paeryn SDL wird nach dem Aufruf SDL_SetVideoMode und SDL_CreateRGBSurface in der Funktion Mix_OpenAudio der Fehler erzeugt. Warum ist mir bisher nicht klar.

Gruß
Thomas
 
Das ist seltsam.

Was gibt dir denn Mix_OpenAudio zurück und was für Parameter übergibts du?
 
Der Aufruf erfolgt mit Mix_OpenAudio(22050, AUDIO_S16, 2, 1024) und das Program wird innerhalb der Funktion abgebrochen. Man sieht noch die Debugausgaben über das Beenden von SDL und das wars.

Gruß
Thomas
 
Hm, also ich selbst habe von SDL_Mixer Abstand genommen, da ich damit reichlich Probleme hatte.
Ein Spielchen auf der GP2X läuft einfach flotter mit MikMod.
Klar, das kann nicht alles was SDL_Mixer kann, doch hatte ich zum Beispiel beim Supertux Port einfach kein flüssiges Gameplay mit Musik per SDL_Mixer zustande bekommen, mit MikMod geht das jedoch fein.
 
KidPaddle, eröffne Audio mal nach dem du SDL initialisiert hast und bevor du SDL_Surfaces erstellt hast.
 
Leider das gleiche Ergebnis. Sobald die SDL statisch eingebunden wird, erscheint diese Felhermeldung. Ich werde ein anderes Projekt testen, welches erfolgreich auf dem GP2X läuft. Wenn hier das statische binden auch Probleme macht, weis ich nicht wonach ich suchen soll.

Gruß
Thomas
 
Back
Top