GP2X development mit DevC++


Meint multitarget, dass du mit einem kompiliervorgang die ausführbare datei fün win und gp2x bekommst? Wenn ja wäre ich für eine kleine beschreibung wie man das hinbekommt dankbar.
 
Man bekommt zwei Dateien... bzw. man kann festlegen, ob das nächste Kompilat für Windows ist oder den GP2x... (sprich: Alt-P, dann Target ARM oder Intel auswählen, Kompilieren, fertig)

Man könnte zwar auch alles in einem machen mit einem Makefile, dann müsste das aber auch jeweils angepasst werden wenn man Dateien hinzunimmt - die Lösung mit alternativ Win/GP2x ist am besten in der IDE des DevCPP...

Habe das Kit nun auch schon auf dem zweiten PC getestet und werde wohl bald ein Päckel schnüren mit Anleitung und Demo Programm... Hatte die letzten Tage nur leider ein bissel mehr Arbeit als erwartet deswegen verzögert sich das noch...
 
Ich versuche seit längerer Zeit ein Paar sdl programme zu kompilieren.
Aber ich hab immer linking errors :(
Beispiel:
Code:
mixer.o: In function `Mixer::fadeOut(int)':
mixer.cc:(.text+0x30): undefined reference to `Mix_FadeOutChannel'
mixer.o: In function `Mixer::stopMusic(int)':

mixer.cc:(.text+0x68): undefined reference to `Mix_FadeOutMusic'
mixer.o: In function `Mixer::freeMixer()':
mixer.cc:(.text+0xc4): undefined reference to `Mix_ExpireChannel'
mixer.cc:(.text+0xf8): undefined reference to `Mix_FreeChunk'

mixer.cc:(.text+0x16c): undefined reference to `Mix_FreeMusic'

mixer.o: In function `Mixer::initMixer()':
mixer.cc:(.text+0x1ec): undefined reference to `Mix_OpenAudio'
mixer.cc:(.text+0x218): undefined reference to `Mix_AllocateChannels'
mixer.cc:(.text+0x220): undefined reference to `Mix_ReserveChannels'
mixer.o: In function `Mixer::loadSample(std::string, int)':
mixer.cc:(.text+0x1238): undefined reference to `Mix_LoadWAV_RW'
mixer.cc:(.text+0x1300): undefined reference to `Mix_VolumeChunk'
mixer.o: In function `Mixer::stopSample(int)':
mixer.cc:(.text+0x1468): undefined reference to `Mix_HaltChannel'
mixer.o: In function `Mixer::playSample(int, int, bool)':
mixer.cc:(.text+0x1530): undefined reference to `Mix_PlayChannelTimed'
mixer.cc:(.text+0x15d8): undefined reference to `Mix_PlayChannelTimed'
mixer.o: In function `Mixer::loadMusic(std::string)':

mixer.cc:(.text+0x17cc): undefined reference to `Mix_LoadMUS'
mixer.o: In function `Mixer::playMusic(MusicTracks, int, int)':

mixer.cc:(.text+0x1a28): undefined reference to `Mix_FadeInMusic'
soundDB.o: In function `SoundDB::~SoundDB()':
soundDB.cc:(.text+0x19c): undefined reference to `Mix_FreeChunk'
soundDB.o: In function `SoundDB::~SoundDB()':
soundDB.cc:(.text+0x348): undefined reference to `Mix_FreeChunk'
soundDB.o: In function `SoundDB::loadWav(std::string)':
soundDB.cc:(.text+0x5d0): undefined reference to `Mix_LoadWAV_RW'

Hier mackt die sdl_mixer rum.
muss ich da was extra einbinden?

MfG
IceOnly
 
IceOnly said:
...
soundDB.o: In function `SoundDB::loadWav(std::string)':
soundDB.cc:(.text+0x5d0): undefined reference to `Mix_LoadWAV_RW'[/code]

Hier mackt die sdl_mixer rum.
muss ich da was extra einbinden?

MfG
IceOnly

Wie groß ist deine C:\devkitGP2X\lib\libSDL_mixer.a?
Knapp 1,6 MB oder knapp > 300 KB? Wenn du nur die 300er hast, dann empfehle ich folgenden Thread http://www.gp32x.com/board/index.php?showtopic=22759

Da gibt es auch die große libSDL_mixer.a...

Hth
BNrXYZ
 
danke !
mit der grossen gings durch.
Ich hab mal alienblaster durchgeschickt aber das bild bleibt leider schwarz.
http://www.schwardtnet.de/alienblaster/

vll kann mir einer sagen warum :D
würde auch gerne was portieren
hab auch die grösse des screen angepasst

mfG
IceOnly
 
IceOnly said:
...aber das bild bleibt leider schwarz...

gib mal bitte in DEVcpp in den Projektoptionen, wo du sagst "-lSDL -lSDLmain" auch noch ein "-static" ein (alles ohne die "), also einfach hinten dranhängen.

Hth
BNrXYZ
 
Meine linker Parameter sind folgende:
-lSDLmain -lSDL -lSDL_mixer -static

Ist doch richtig so, oder?

Wofür ist das static überhaupt?

Also das Alienblaster lässt sich echt problem los kompilieren aber wenn man es auf den GP2X startet kommt der masuyeiger und dann bleibt das bild schwarz. Ich muss den source mal durchstöbern vielleicht will der ne datei im NAND ablegen aber de ngib ich nicht mehr frei :)

PS: Kann ich mit sterm ein programm so starten das di grafik ausgabe unterbunden wird? vll gibt es ja ein fehler zurück. Dafällt mir ein es könnte mal jemmand ein strg-alt-entf tool schreiben. Damit Entwickeler die programme im notfall killen können.

MfG
IceOnly
 
-static heißt "statisch linken"
Ich würde wegen den Fehlermeldungen vorschlagen, nen Script
zu schreiben, dass stderr/stdout in eine Datei umleitet.
 
Tried to duplicate your work to see what's going on.

I changed the obvious things in the Makefile, and in global.h wrote:
const int SCREEN_WIDTH = 320;
const int SCREEN_HEIGHT = 240;
const int BIT_DEPTH = 16;

ran make, stripped the executable to save some space, copied executable and what I think is the gamedata to sd card.
ran alienblaster on gp2x using sterm, got some initialisation messages and then a SEGV.

Then I made a native build to compare, that seemed to start up fine, although with the smaller screen the menus are messed up, so it's going to be more work to make it work on GP2X anyway.

Looked a little closer at the source, video.cc calls SDL_SetVideoMode with SDL_DOUBLEBUF, which doesn't work on GP2X: http://wiki.gp2x.org/wiki/SDL_FAQ

Will try a little more (have some time during my nightshift)

Edit 1:

changed the video.cc lines to read:
screen = SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, BIT_DEPTH, SDL_SWSURFACE /* | SDL_FULLSCREEN */ );

now it doesn't give a SEGV anymore, but "does not exist!es/tile-water.bmp" comes up instead. Looks like it overwrote part of the error message, so it's a little hard to interpret, but looking at the images directory there _is_ a tile-water.bmp there. Maybe it needs a ./ as some of the names in the .cfg files do have this and some don't.

Edit 2:

The error seems to come from surfaceDB.cc:
Code:
// open the file for reading
  ifstream inputFile ( fn.c_str(), ios::in);
  if (!inputFile.good()) {
    cout << "ERROR: file " << fn << " does not exist!" << endl;
    exit(1);
  }

added some extra debug output (developers have it dump to cout, not cerr, so I followed suit):

cout << "Opened: " << fn << endl;

This prints out about 21 files that are 'good()', then it fails for the water tile. probably some resource is running out... I doubt that if good() returns false, it means for sure that the file doesn't exists, so probably need to add better error handling here to figure out what is going on.
Going to have to brush up on my C++ to do this though...

More later.

Edit 3:

Read http://www.cplusplus.com/ref/iostream/ios/good.html, added more debugging to the surfaceDB.cc file:
Code:
out << inputFile.bad() << endl << inputFile.eof() << endl << inputFile.fail() << endl;

this returns 0 0 1 , so the 'fail bit' is set in the stream. looks like the function is never closing these files it opens, so maybe it's running out of handles. Also it's just opening them to check if the files exist. probably would be better to just check if SDL_LoadBMP returns a non NULL pointer instead. Ripping this part out of the function:
Code:
SDL_Surface *SurfaceDB::loadSurface( string fn, bool alpha ) {

  SDL_Surface *searchResult = getSurface( fn );
  if ( searchResult ) {
    return searchResult;
  }

  cout << "Opening: " << fn << endl;

  SDL_Surface *newSurface = SDL_LoadBMP( fn.c_str() );
  if (newSurface == NULL) {
    cout << SDL_GetError() << endl;
    exit(1);
  }

  SDL_SetColorKey( newSurface, SDL_SRCCOLORKEY,
                   SDL_MapRGB(newSurface->format, transR, transG, transB) );
  if ( alpha ) {
    SDL_SetAlpha( newSurface, SDL_SRCALPHA, 128 );
  }

  surfaceDB[ fn ] = newSurface;
  return newSurface;
}

Doesn't help much, the SDL error is just "Couldn't open ./images/tile-water.bmp"


Pieter
 
thx

Ich habe nun das menu vor mir :)
Ich änder erstmal alles auf 320*240
Und dann mach ich es GP2X compatible.

MfG
IceOnly

€dit: Habs am laufen muss nur noch die Steurung porten und leider geht der sound nicht.
Weiss einer warum?
Naja erstmal die steuerung :)

€dit die 2:Hmm mit der Performance kann man knicken ich glaub ich stampf die portierung ein
 
Gibt es die möglichkeit nur bestimmte libaries statisch zu linken?

MfG
IceOnly
 
In theory this is possible, butI'm not sure how to do it 'im Praxis', perhaps the position of the -static option matters, we'd have to check the manuals, but I can't do that properly at the moment (typing this from my bed on ipaq).
I know it is possible because you could always use 'ar -x' to extract the individual object files from the libs you want to link statically, and then just link those in the normal way.

P.
 
ich habe gerade nochmal ein problem mit dem einbinden der minlib dateien von rleyh.

ich habe die dateien in den ordner c:\devkitpro\devkitgp2x\minlib gelegt.
jetzt erstelle ich ein neues projekt, das die minlin.h enthält.
beim compilieren erhalte ich natürlich erstmal den fehler, dass minlib.h nicht gefunden werden kann.
also setze ich in den "project options" bei "include directories" den pfad ein, in dem die minlib.h liegt.

wenn ich jetzt compiliere, wird die minlib.h zwar gefunden, aber ich erhalte fehler, die sich auf die minlib beziehen.
Code:
<i>
</i>  [Linker error] undefined reference to `gp2x_init' 
  [Linker error] undefined reference to `gp2x_video_flip' 
 usw...

wenn ich die minlib.h und die minlib.c jedoch in mein projekt-verzeichnis kopiere und sie dem projekt hinzufüge, geht alles wunderbar.

wo liegt hier der fehler?
ich hätte die minlib-dateien natürlich gerne ausserhalb meines projekt-ordners, damit ich von allen projekten aus darauf zu greifen kann und sie somit auch für alle projekte einfach zu updaten sind.
 
O-bake said:
ich habe gerade nochmal ein problem mit dem einbinden der minlib dateien von rleyh.

ich habe die dateien in den ordner c:\devkitpro\devkitgp2x\minlib gelegt.
jetzt erstelle ich ein neues projekt, das die minlin.h enthält.
beim compilieren erhalte ich natürlich erstmal den fehler, dass minlib.h nicht gefunden werden kann.
also setze ich in den "project options" bei "include directories" den pfad ein, in dem die minlib.h liegt.

wenn ich jetzt compiliere, wird die minlib.h zwar gefunden, aber ich erhalte fehler, die sich auf die minlib beziehen.
Code:
<i>
</i>  [Linker error] undefined reference to `gp2x_init' 
  [Linker error] undefined reference to `gp2x_video_flip' 
 usw...

wenn ich die minlib.h und die minlib.c jedoch in mein projekt-verzeichnis kopiere und sie dem projekt hinzufüge, geht alles wunderbar.

wo liegt hier der fehler?
ich hätte die minlib-dateien natürlich gerne ausserhalb meines projekt-ordners, damit ich von allen projekten aus darauf zu greifen kann und sie somit auch für alle projekte einfach zu updaten sind.

DevCpp, oder?
Dann musste im Filemanager auf der seite auf datei zum Projekt hinzufügen klicken und die minimal.cpp auswählen so gings bei mir.

MfG
IceOnly
 
Back
Top