一直等待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一開始編譯
更正一下,使用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.cpp與OgreD3D9Plugin.cpp這兩個檔案
前者要把OgreMinGWSupport.cpp 第47行
後者則是要把OgreD3D9Plugin.cpp 第36行
這樣下去編譯的話,Mingw-w64版本的Ogre 1.8.1就能用了
而且bullet 2.82也沒問題
剩下的,果然還是要實際寫個東西出來吧 XD
再來是OgreMinGWSupport.cpp與OgreD3D9Plugin.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.cpp 第36行
#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
沒有留言:
張貼留言