[vox-tech] Cross compiling SDL/OpenGL on Linux for a win32 executable

Peter Jay Salzman p at dirac.org
Tue Aug 3 13:20:00 PDT 2004


Hi all,

I finally managed to cross compile an SDL/OpenGL program on Linux for
win32.  Here's how I did it and some pitfalls along the way.  This was
_not_ easy to figure out!  I hope other people can benefit from this.

This email is to be regarded as heuristic knowledge.  Some of it I had
no idea of the rhyme or reason.  It's just a lot of edumacated
guesswork, trial and error, Googling and good ol fasioned
try-by-desperation.



Downloading Stuff
=================

1a. Download and run the cross-compile tools installer from:

   http://www.libsdl.org/extras/win32/cross/build-cross.sh

   Running this script will download almost everything I needed.  Among
   other things, it downloaded the cross compiler mingw32 and a
   binutils.  By default, it nicely puts everything in
   /usr/local/cross-tools.


1b. Download the SDL libraries:

      SDL-devel-1.2.7-mingw32.tar.gz

   Install to the /usr/local/cross-tools tree with "make cross".


1c. Download the cross-make script from:

      http://www.libsdl.org/extras/win32/cross/cross-make.sh

    and put it in the directory of your source code.


1d. If you know how to use auto-tools, download:

      http://www.libsdl.org/extras/win32/cross/cross-configure.sh

    and put it in the directory of your source code.



Coding Stuff
============

2a. main() must be defined as:

      int main( int argc, char *argv[] )

   and definitely not:

      int main( void )

   otherwise you'll get "previous declaration of `SDL_main'" errors
   (even if you don't use argc and argv).  If the "unused parameter"
   warnings bug you, use the -Wno-unused-parameter compiler flag.  In
   particular, don't define or declare:

      anything WinMain( anything )

   despite what the error/warning messages tell you.


2b. Never use the standard GL header files:

      #include <GL/gl.h>
      #include <GL/glu.h>

   Instead, use this one if you're going to use OpenGL:

      #include <SDL_opengl.h>

   I've been told this is a good habit to get into even if you have no
   immediate plans to cross compile.




Making Stuff
============

3a. Don't use "sdl-config --libs" for linking.  Instead, use this, and
   don't change the order; ORDER IS IMPORTANT:

      -lmingw32 -lSDLmain -lSDL -lopengl32 -lglu32

   If you get "-lpthread not found" errors, you've used sdl-config for
   the linking stage.


3b.  Note that instead of "-lGL", you use "-lopengl32".  Instead of
   "-lglu", you use "-lglu32".  If you're going to use GLUT for
   windowing, you use "-lglut32" instead of "-lglut".


3c. This is my first working cross compile Makefile (you need a
   directory .deps/ in the source directory):


   TARGET = alpha-blending.exe
   CFILES = $(wildcard *.c)
   OFILES = $(patsubst %.c, %.o, $(CFILES))
   DFILES = $(patsubst %.c, .deps/%.d, $(CFILES))
   CC     = gcc
   WARN   = -W -Wall -Wmissing-prototypes -Waggregate-return -Wpointer-arith \
            -Wcast-qual -Wcast-align -Wmissing-declarations -Wnested-externs \
            -Wredundant-decls -Wwrite-strings -Winline -Wno-unused-parameter
   CFLAGS = `sdl-config --cflags` $(WARN)
   LDLIBS = -lmingw32 -lSDLmain -lSDL -lopengl32 -lglu32

   all: $(TARGET)
    
   $(TARGET): $(OFILES)
      $(CC) -o $(TARGET) $(OFILES) $(LDLIBS)

   .deps/%.d: %.c
      @$(CC) -MM $(CFLAGS) $< > $@.$$$$; \
      sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; rm $@.$$$$

   ifneq ($(MAKECMDGOALS),clean)
   -include $(DFILES)
   endif

   .PHONY: clean

   clean:
      $(RM) $(TARGET) $(OFILES) $(DFILES) core


3d. To cross compile, you use:

      sh cross-make.sh

   Where cross-make.sh is one of the files you downloaded from step 1c.


3e. By default, things are linked dynamically, so wherever your
   application goes, the person will need a copy of SDL.dll (which comes
   with the stuff you downloaded in step 1).

   Mingw32 knows the -static switch, but I haven't tested it yet.


3f. My cross compiled win32 applications ran on MS Windows (yay!) but it
   crashed wine/winex.  YMMV.


7g. My makefile is cross-compile only.  I currently need two makefiles;
   one for Linux and another for cross compiling for win32.  This email:

      http://twomix.devolution.com/pipermail/sdl/2004-June/062545.html

   describes a portable Makefile (without autotools) and deserves to be
   looked at when I have more time.



I worked up a sweat figuring this one out!  Sheesh!

Pete

-- 
Make everything as simple as possible, but no simpler. -- Albert Einstein
GPG Instructions: http://www.dirac.org/linux/gpg
GPG Fingerprint: B9F1 6CF3 47C4 7CD8 D33E 70A9 A3B9 1945 67EA 951D


More information about the vox-tech mailing list