欢迎访问http://omegacoleman.sinaapp.com/
===========
最近在弄SDL,在Linux(fc17)下完成开发后,准备用mingw移植到Windows平台。相比在Windows下用mingw编译,其实有更好的方案:在Linux上直接使用mingw交叉编译,方法如下:
-没安装mingw32-gcc的,用包管理器安装。我这里是:
yum install mingw32-gcc
-然后,运行i686-w64-mingw32-gcc,就像在运行gcc一样进行编译。使用SDL时建议加上 -lmingw32,最后,命令应该是这样:
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()前插入这么一句:
#undef main
这个就很奇怪了,还有更加奇怪的:
无论是自己创建一个线程解析事件,或是使用SDL_INIT_EVENTTHREAD来达到相同的功能,在Linux下可以正常运行,在Windows下无一例外会导致程序锁死——僵死,死机,随你怎么称呼。
我花了6小时才查出这个原因(我的美好时光TAT),无论如何改进,都不能在Windows上用线程解析事件,所以,不要尝试在Windows上用线程解析事件!
我搜索到了网友eng_2005的一个提示:
提示: 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