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


转载于:https://my.oschina.net/coleman/blog/103508

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值