歡迎訪問http://omegacoleman.sinaapp.com/ shell
=========== app
最近在弄SDL,在Linux(fc17)下完成開發後,準備用mingw移植到Windows平臺。相比在Windows下用mingw編譯,其實有更好的方案:在Linux上直接使用mingw交叉編譯,方法以下:
-沒安裝mingw32-gcc的,用包管理器安裝。我這裏是: 異步
yum install mingw32-gcc
i686-w64-mingw32-gcc ….c -o ….exe -lSDL -lSDL_image -lSDL_gfx -lmingw32 … -Wall
這個時候第一個問題出現了:gcc正確編譯的代碼被報錯了: 性能
/usr/i686-w64-mingw32/sys-root/mingw/lib/../lib/libmingw32.a(lib32_libmingw32_a-crt0_c.o): (.text.startup+0x39): undefined reference to `WinMain@16' collect2: error: ld returned 1 exit status
google以後,有了答案,應在有main()的文件裏面main()前插入這麼一句: ui
#undef main
這個就很奇怪了,還有更加奇怪的: google
不管是本身建立一個線程解析事件,或是使用SDL_INIT_EVENTTHREAD來達到相同的功能,在Linux下能夠正常運行,在Windows下無一例外會致使程序鎖死——僵死,死機,隨你怎麼稱呼。 spa
我花了6小時才查出這個緣由(個人美好時光TAT),不管如何改進,都不能在Windows上用線程解析事件,因此,不要嘗試在Windows上用線程解析事件! 線程
我搜索到了網友eng_2005的一個提示: code
提示: Linux和BeOS支持 SDL_INIT_EVENTTHREAD,調用SDL_Init()時使用該標記將使得事件循環在另外一個線程中異步運行。這樣即便程序忙,色彩光標也能響應。——也就是,Windows不能夠?
用線程解析事件是個絕妙的主意(不管是性能仍是效率),但若是你的產品面向Windows,give it up。你能夠採用過濾器這個方法——也能提升效率,但沒有線程明顯——不過,Windows上可用:) 事件
像這樣:
…… int process_events(const SDL_Event *event) …… int main(int argc, char **argv) { …… SDL_SetEventFilter(process_events); …… // 主循環 while (! quited) { SDL_PollEvent(NULL); …… } return 0; } int process_events(const SDL_Event *event) { switch (event->type) { case ……: …… case ……: …… case ……: …… } return 0; }
Happy Hacking.
油菜 2013.1