我试图在macOS(High Sierra 10.13.2)上使用SDL玩一下,我偶然发现了一个似乎是一个相当难以理解的错误,涉及SDL窗口无法响应击键。我试图构建两个极少不同的例子来划分出现这个问题的时间:事实上,这些例子确实差别很小,以至于它们的行为完全不同似乎很奇怪。
我安装了1.2.15版本的SDL库,并使用“brew install sdl”命令安装它们。
第一个例子(正确工作的例子)如下:
/* sdl1.c */
#include "SDL/SDL.h"
SDL_Surface *screen;
SDL_Event event;
void initsdl (void) {
SDL_Init (SDL_INIT_EVERYTHING);
screen = SDL_SetVideoMode (500, 250, 32, SDL_SWSURFACE);
SDL_EnableKeyRepeat (SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
while (1)
if (SDL_PollEvent(&event))
if (event.type == SDL_KEYDOWN)
if (event.key.keysym.sym == SDLK_ESCAPE)
break;
SDL_Quit ();
}
int main (int argc, char **argv) {
initsdl ();
return 0;
}
另一个例子几乎相同,但分布在两个文件中。
/* sdl2a.c */
#include "SDL/SDL.h"
SDL_Surface *screen;
SDL_Event event;
void initsdl (void) {
SDL_Init (SDL_INIT_EVERYTHING);
screen = SDL_SetVideoMode (500, 250, 32, SDL_SWSURFACE);
SDL_EnableKeyRepeat (SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL);
while (1)
if (SDL_PollEvent(&event))
if (event.type == SDL_KEYDOWN)
if (event.key.keysym.sym == SDLK_ESCAPE)
break;
SDL_Quit ();
}
第二个文件是:
/* sdl2b.c */
void initsdl(void);
int main (int argc, char **argv) {
initsdl ();
return (0);
}
正如您所看到的,这些程序几乎完全相同,唯一真正的区别在于其中一个程序分布在两个文件中。
现在,我使用命令
编译这些文件cc -Wall -o sdl1 sdl1.c `sdl-config --libs` # (1)
和
cc -Wall -o sdl2 sdl2a.c sdl2b.c `sdl-config --libs` # (2)
我对结果行为有两点不同。
首先,第一个例子没有给出任何警告,而第二个例子给出了以下警告:
ld: warning: object file (/usr/local/lib/libSDLmain.a(SDLMain.o)) was built for newer OSX version (10.13) than being linked (10.12)
然而,第二个区别更成问题。而第一个例子( 给出编译器警告的那个)表现得如此,屏幕上出现一个窗口,在退出之前正确响应按ESC键,第二个例子只是即使在点击窗口使其激活之后,也根本没有响应键击。这个结果是通过直接从终端执行编译生成的二进制文件获得的。