2013年11月27日 星期三

使用Mingw-w64來編譯Ogre 1.8.1與Bullet 2.82

上次使用新的Mingw 4.8.1-4的版本編譯Ogre成功,但失敗在Bullet 2.81。
一直等待Mingw團隊Release 4.8.2的gcc來解決問題也不是辦法,
這期間就先使用Visual Studio 2010 Express來編寫Ogre+Bullet。
但是使用上很不習慣,還是想用回Code Blocks。
於是,花了好大的一番功夫,一一對照參數搞起來後。
卻又看到Mingw-W64計畫,反正新電腦編譯快,想說用用看。
就下載其中Mingw-builds Project的32位元版本下來測試
裡面有4.8.1與4.8.2當然是選擇4.8.2的版本,再選threads-win32裡SJLJ的版本
(i686-4.8.2-release-win32-sjlj-rt_v3-rev0.7z)
這下建立bullet沒問題了

OgreDeps到OgreMain一開始編譯也都OK,昨天發現其實不OK!
更正一下,使用Mingw-w64編譯官方的OgreDeps在libzzip的部分也有問題
在最後產生OgreMain時,連結libzzip會出現重複定義的問題
如官方討論區這篇(Compiling Ogre: zziplib - multiple definitions)所述

接下來就是是卡在RenderSystem_Direct3D9的部分…
好佳在,最後是有解決,不過這必須更改Ogre的原始碼
這就是亂用不是官方指定的缺點

首先libzzip的部分
這篇(Compiling Ogre: zziplib - multiple definitions)本身就有解答與連結了
需要修改libzzip的三個檔案,分別是CmakeList.txt的定義與__dirent.h、conf.h這三個檔案
修改項目在此連結
要是覺得這樣改麻煩的話,也可以直接下載此作者私人OgreDeps
連結在此,他幫你改好了

至於RenderSystem_Direct3D9的部分
有更改到的有三個檔案,分別是在OgreMain裡的
OgreMinGWSupport.h、OgreMinGWSupport.cpp與
在RenderSystems裡Direct3D9的OgreD3D9Plugin.cpp

之所以會更動到這三個檔案,主因為Direct3D9是純MSVC(Microsoft Visual C++)函式庫
要與之連結,需要一些相對應的定義與函數處理。
然而原生的Mingw與修改後的Mingw-w64在某些定義上與處理上是不同的
因此,Ogre團隊所寫的Mingw輔助自然就不支援Mingw-w64。
那就只能認分自己修改啦,誰叫要用不是官方的東西咧,幸好不會很難。

首先是OgreMinGWSupport.h裡面第47
#define UINT8 uint8_t
#define WINAPI_INLINE inline
#define __uuidof(Object) IID_##Object

把它註解隱藏起來成為
//#define __uuidof(Object) IID_##Object
因為在Mingw-w64的unknown.h裡已經有定義了

再來是OgreMinGWSupport.cppOgreD3D9Plugin.cpp這兩個檔案
前者要把OgreMinGWSupport.cpp 47
//MSVC uses security cookies to prevent some buffer overflow attacks.
//provide dummy implementations.
intptr_t __security_cookie;
加上註解隱藏
//intptr_t __security_cookie;

後者則是要把OgreD3D9Plugin.cpp36
#ifdef __MINGW32__
extern "C" {   
#include "WIN32\OgreMinGWSupport.h"
void _chkstk();
void _fastcall __security_check_cookie(intptr_t i);
}  
#endif
加上註解隱藏
//void _fastcall __security_check_cookie(intptr_t i);
因為這兩者在Mingw-w64裡是已經定義在process.h

這樣下去編譯的話,Mingw-w64版本的Ogre 1.8.1就能用了
而且bullet 2.82也沒問題
剩下的,果然還是要實際寫個東西出來吧 XD

沒有留言: