Mingw+SDL移植须知:不要尝试在Windows上用线程解析事件!

欢迎访问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


你可能感兴趣的:(c,gcc,MinGW,sdl)