Mingw32 and directx

## MINGW32 AND DIRECT X

The original header files seems to work so the only problem is to update the lib files that means creating one static and some import libraries. Here is how I did it for directx 7 and how you can update it for common versions.

1. Copy all DEFINE_GUID definitions from the directx header files to dxguid.c this will become a static library and replace dxguid.lib from Microsoft. In dxguid.c should also the constants from dinput.h be defined.

2. Create the import libs I tried to let reimp do this but it did not work all the way but running reimp -s > file.def gave me the symbols with parameter size. You will need to edit the def files slightly with an EXPORTS on top and perhaps deleting irrelevant garbage.

3. I created a makefile this file must perhaps be updated in the future.

4. Run make and place the libs in the compiler lib directory.

As far as I know do mingw32 support all of directx in both C and C++ with full COM support. My libs can of course miss a lot and the data for the new Mouse2 is probably wrong since I took it after some inspecting of dinput.lib with a dump tool. :-)
Some comments about using directx with mingw32:

- C++ programs must be compiled with the -fvtable-thunks switch. Don't worry gcc will tell you if you forgot to use it. about 1000 times :-)
- d3d has a bad reputation I and many with me prefer open GL instead
- WINNT is defined despite I am running win95 this created problems with ddraw.h so I put an undef WINNT at top of it no guarantees that this is the way to solve it
- a lot of warnings about redefinition I haven't checked out why
- if you are compiling the examples from Microsoft's SDK (available at MSDN) don't forget to compile the .rc file with windres and link with it. For example "windres app.rc appres.o" creates appres.o and this file should be linked like the other .o files.
- windres can not compile all .rc files but in the DEBUG directory is it a precompiled .res file that windres can use. ("windres app.res appres.o")
- an alternative can be to use another resource compiler like the one from Borland to create the .res file
- some SDK examples can not be compiled because of incomplete header files but if you download the Borland compiler do you also get a more complete set of headers. If something is missing in the mingw32 headers can you search for it in the Borland headers (MS original) and update the mingw32 files.
- in many cases is it better to use allegro instead of directx directly (easier and portable) the windows version of allegro is using directx
- MSVC accepts non ANSI C++ this is common in the MSDN examples
- if an SDK example does not work properly is it probably because of some MSVC hack, do not assume something else unless you can compile and link with -Walll without getting any warnings

OK, enough of advises here is the dxlibs you must get the headers from Microsoft.

Microsoft SDK for directx (the full SDK is recommended but you only need to download the headers)
MS SDK examples (and here is some simple makefiles I have done for some of the examples)
Peter Hawkins original dirext 5.0 port (my directx work is based on his port but the limitations is history)
John Fortins 6.0 port with the donuts example (use this makefile instead if you want to compile the donuts example on his page)

If you are interested in directx programming do I think that it would be great if you created a page with info and makefiles for the SDK examples with mingw32. That could certainly help a lot of people!

back to main page