TDM MinGW64 build guide        
GCC Logo

This is a guide for building Ogre and its dependencies statically, using a variation of MinGW compiler, TDM MinGW64
It covers most steps in detail, the changes you need to make to the source code so it compiles and other nifty tricks to make things work. Tested on Windows 7 x64 with Ogre 1.10.0



I. Introduction

This article will explain the modifications that need to be made to Ogre and Ogre's dependencies, so they can be compiled with TDM 4.9.2 MinGW. Generally, this guide should apply to all MinGW64 editions.
It is meant for building Ogre 1.10.0 from source.



II. Ogredeps

1. To have a true static build, we also want static OIS. To achieve this we need to build it from source.
First get OIS source package here: OIS SourceForge repository
From here on let's assume you extracted the package into 'ois-v-1-3' (original folder name)

Open 'ois-v-1-3/Win32/ois.cbp' and go to project build options:
In all the build targets (select OIS), go to compiler search directories and change:

C:\Program Files\Microsoft DirectX SDK (November 2008)\Include
to
C:\C++\TDM-4.9.2\x86_64-w64-mingw32\include
(This is an example installation dir of TDM, change it to yours)


In 'OIS_DebugDll' and 'OIS_ReleaseDll' build targets add these libraries to linker options: wbemuuid, ole32, oleaut32 (dinput8 and dxguid should already be there)

This package is designed to be compiled with MSVC, so we need to make some changes to the source to make it compile under TDM.

Open 'Win32Joystick.cpp'

At line 587 change this:
hr = CoCreateInstance(uuidof(WbemLocator), NULL, CLSCTX_INPROC_SERVER, uuidof(IWbemLocator), (LPVOID*)&pIWbemLocator);
To this:
hr = CoCreateInstance(CLSID_WbemLocator, NULL, CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID*)&pIWbemLocator);
At lines 637 and 641, replace
swscanf_s
with just
swscanf


Now OIS should successfully build with only 25 warnings or so (it's safe to ignore them).
Open 'ois-v-1-3/lib' and rename libOIS_static.a to libOIS.a (same for the _d version)


2. Now that OIS is succesfully built you will want to get NVidia's Cg Toolkit from: https://developer.nvidia.com/cg-toolkit-download
Install the package.
The toolkit is in MSVC format and sadly doesn't work with MinGW, so we will need to convert it (read further about this here: http://www.mingw.org/wiki/msvc_and_mingw_dlls
Download 'reimp' tool to convert Cg libs from MSVC to MinGW format (Google will help you here).
Make a folder and call it 'converter'.
In 'converter' make two folders, one called 'bin' and the other 'lib'.
Move 'reimp.exe' into 'converter/bin'.
Copy 'cg.dll' and 'cg.lib' from Cg Toolkit's installation directory into 'converter/lib'.

Now open notepad and save this as 'convert.bat' (MAKE SURE THE EXTENSION IS .BAT AND NOT .TXT) in 'converter' folder.

set lib_file=Cg.lib
set dll_file=Cg.dll
set def_file=Cg.def
set   a_file=libcg.a

cls
@echo off

cd lib

echo  [ Making .DEF file ]
echo.

..\bin\reimp.exe -d %lib_file%

echo  [ Making .A linker library ]
echo.
echo.

dlltool --as-flags=-64 -m i386:x86-64 --input-def %def_file% -dllname %dll_file% --kill-at --output-lib %a_file%

echo Success, now exiting.
exit


Run 'convert.bat' and you should find 'libcg.a' in 'converter/lib'. Use this instead of cg.lib in ogredeps (CMake should find it automatically, even when the names are not the same).


3. Now that OIS is succesfully built you need to get the rest of Ogredeps from here: Ogredeps Bitbucket repository
From here on, let's assume that you extracted the package into 'ogredeps' and used 'ogredeps-build' as the build directory.

On 64 bit systems, you need to change Line 210 of 'ogredeps\src\FreeImage\Source\FreeImage\PluginTIFF.cpp'

// Warning: tif_fd is declared as 'int' currently (see libTIFF), 
    // may result in incorrect file pointers inside libTIFF on 
    // 64bit machines (sizeof(int) != sizeof(long)). 
    // Needs to be fixed within libTIFF.
   if (tif) {
      tif->tif_fd = (long)handle;
   }
 
   return tif;

Change to this:

tif->tif_fd = (intptr_t)handle;


zziplib builds fine itself, but it errors pop up when you try to link against it at the end of building Ogre.

To fix this, you need to open "ogredeps/src/zziplib/zzip/conf.h" and change line 25 from:
# if defined _MSC_VER || defined __BORLANDC__ || defined __WATCOMC__
to
# if defined _MSC_VER || defined __BORLANDC__ || defined __WATCOMC__ || defined _WIN32
and line 162 from
#if defined _MSC_VER || defined __WATCOMC__
to
#if defined _MSC_VER || defined __WATCOMC__ || defined _WIN32
and line 166 from
#ifdef _MSC_VER
to
#if defined _MSC_VER || defined _WIN32
and line 186 from
#if defined _MSC_VER || defined __WATCOMC__
to
#if defined _MSC_VER || defined __WATCOMC__ || defined _WIN32
Then open "ogredeps/src/zziplib/CMakeLists.txt" and change line 45 from:
if (WIN32)
add_definitions(-D_MSC_VER)
to
if (WIN32 AND BUILD_SHARED_LIBS)
add_definitions(-DZZIP_DLL)
link_libraries(zlib)

In CMake uncheck "OGREDEPS_BUILD_OIS"
Ogredeps should build successfully. Run the 'install' build target.
Now run the 'edit_cache' build target and change CMAKE_BUILD_TYPE from "Release" to "Debug", then press generate and close CMake when it's done.
Build 'all' again and run 'install'.
Rename 'ogredeps-build/ogredeps' to 'Dependencies'.
Copy OIS includes and libs from OIS source dir to Dependencies (also the .dlls, even though we use static OIS, Ogre will want to see the .dlls because it expects dynamic OIS. Don't worry, Ogre will still link statically), make sure to follow the filesystem of the rest of the dependencies.




III. Ogre

Download Ogre from Ogre Bitbucket repository
From here on let's assume you extracted Ogre source to 'ogre' and use 'ogre-build' as the build directory.
Move 'Dependencies' into the 'ogre' folder.
To fix an Ogre bug with 64 bit MinGW, Open 'ogre/CMakeLists.txt', find the flag '-march=i686' and change it to '-march=native'.

Download the attached 'winres.h' file and put it in 'ogre/OgreMain/src/WIN32' (For some odd reason it's missing from newer commits)

 Plugin disabled
Plugin attach cannot be executed.

In 'ogre/OgreMain/include/WIN32/OgreMinGWSupport.h' change line 46 from:
#define WINAPI_INLINE inline
to
#ifndef WINAPI_INLINE
#define WINAPI_INLINE inline
#endif // WINAPI_INLINE

Then, to remove an annoying warning that pops up a lot, change:
#ifndef __uuidof(Object)
to
#ifndef __uuidof

Now open 'ogre/OgreMain/src/WIN32/OgreMinGWSupport.cpp' and comment out line 46 like this (it is already defined in TDM headers, multiple definitions cause errors):
//intptr_t __security_cookie;
Then change line 48 from:
void _fastcall __security_check_cookie(intptr_t i)
to
void _fastcall __security_check_cookie(uintptr_t i)


Edit 'ogre/RenderSystems/Direct3D9/src/OgreD3D9Plugin.cpp'.

Change line 36 from:
void _fastcall __security_check_cookie(intptr_t i);
to
void _fastcall __security_check_cookie(uintptr_t i);
And change line 63 from:
__security_check_cookie((intptr_t)NULL);
to
__security_check_cookie((uintptr_t)NULL);


Edit 'ogre/RenderSystems/Direct3D9/include/OgreD3D9Prerequisites.h' at line 75:

Remove
#include <DxErr.h
Add
#include <dxerr9.h>
#define DXGetErrorDescription(hr) DXGetErrorDescription9(hr)


Edit 'ogre/RenderSystems/Direct3D9/src/OgreD3D9HLSLProgram.cpp'.

At line 33 add:
#include <d3dcompiler.h>

At line 865 (864 originally, 865 after added include) change:
LPD3DXBUFFER pDisassembly=0;
HRESULT hr=D3DXDisassembleShader(code,FALSE,"// assemble code from D3D9HLSLProgram\n",&pDisassembly);
to
LPD3DBLOB pDisassembly=0;
HRESULT hr=D3DDisassemble(code,sizeof(code),FALSE,"// assemble code from D3D9HLSLProgram\n",&pDisassembly);

In 'ogre/RenderSystems/Direct3D9/src/OgreD3D9RenderSystem.cpp' change line 473 from:
d3dEx->QueryInterface(__uuidof(IDirect3D9), reinterpret_cast<void **>(&mD3D));
to
d3dEx->QueryInterface(IID_IDirect3D9, reinterpret_cast<void **>(&mD3D));

In 'ogre/RenderSystems/GL/src/Win32/OgreWin32Window.cpp' change line 260 from:
+ ::Ogre::StringConverter::toString(le)
to
+ ::Ogre::StringConverter::toString(size_t(le))

In 'ogre/Samples/EndlessWorld/include/EndlessWorld.h' change line 143 from:
String lName = StringConverter::toString((unsigned long)(t))+"/"+"LodInfoLabel";
to
String lName = StringConverter::toString((size_t)(t))+"/"+"LodInfoLabel";


CMake settings:
CMAKE_BUILD_TYPE: (do both Release and Debug separately running install after each one, just like when building ogredeps)
Change DirectX9_D3DX_LIBRARY to: C:/C++/TDM-4.9.2/x86_64-w64-mingw32/lib/libd3dx9_43.a
Change DirectX9_DXERR_LIBRARY to: C:/C++/TDM-4.9.2/x86_64-w64-mingw32/lib/libdxerr9.a
Change DirectX9_DXGUID_LIBRARY to: C:/C++/TDM-4.9.2/x86_64-w64-mingw32/lib/libdxguid.a
Change DirectX9_INCLUDE_DIR to: C:/C++/TDM-4.9.2/x86_64-w64-mingw32/include
Change DirectX9_LIBRARY to: C:/C++/TDM-4.9.2/x86_64-w64-mingw32/lib/libd3d9.a

Untick OGRE_BUILD_PLUGIN_CG
Untick OGRE_BUILD_RENDERSYSTEM_D3D11
Tick OGRE_BUILD_RENDERSYSTEM_GL3PLUS
Tick OGRE_STATIC
Now generate makefiles.

DO THIS STEP AGAIN AFTER BUILDING RELEASE (OR DEBUG) AND SWITCHING TO THE OTHER (regenerated makefiles will reset this file):
Edit 'ogre-build/Samples/Browser/CMakeFiles/SampleBrowser.dir/link.txt' by adding "-lwbemuuid -ldinput8 -ldxguid -ld3dcompiler_46" at the end of it (we need to link against extra libs, because we use static OIS and because we included d3dcompiler in DirectX9). Sadly, DirectX is not static, so you will need to get d3dcompiler_46.dll from the Windows 8 kit bin folder.

Now after all these changes (whew!), you can finally open the project file and build Ogre. Remember to build and install both targets. When all is done, run SampleBrowser to make sure it works - if it doesn't, something went wrong in the process. If that happens, first make sure you followed all the steps carefully. If you did, post about the problem details in the forum help section.

You may delete OIS.dll and OIS_d.dll from the 'ogre-build/sdk/bin' folder as they are not needed, OIS is static.
Because of this, you must remember to link against wbemuuid, dinput8, dxguid and, if you use directx9 rendering, d3dcompiler_46 in your Ogre projects.

Another thing to remember is to add OgreWin32Resources.res to your projects, all static builds of Ogre need it.

 Plugin disabled
Plugin attach cannot be executed.




IV. Known problems:

  • DirectX11 render system won't compile, it's not supported by MinGW