2012-08-08 27 views
4

我有以下代码。SDL_init()导致c文件不输出

#include <stdio.h> 
#include <SDL/SDL.h> 
#include <SDL/SDL_thread.h> 

#ifdef __MINGW32__ 
#undef main 
#endif 

int main (int argc, char **argv) 
{ 
    printf ("Kishore\n"); 

    if (SDL_Init (SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER)) 
    { 
     fprintf (stderr, "SDL: could not able to initialize SDL : %s", SDL_GetError()); 
     exit (1); 
    } 
} 

能够编译没有任何问题。但是,当我运行可执行文件时,它没有给出任何输出。 使用gcc命令:

gcc -lSDL test.c -o test.exe 

我是否缺少任何东西。

+0

如果甚至不打印字符串''Kishore \ n“'?如果你删除'if'语句,并且只有'printf',那么它工作吗? – 2012-08-08 13:11:54

+0

你的代码,在我的系统上,没有任何修改,工作得很好。它引发“Kishore”并且没有错误地退出。 – larsks 2012-08-08 13:24:53

+1

注意:链接的一般规则:如果'A'使用来自'B'的符号,'B'应该在'A'之后。在你的情况下,因为你使用'libSDL.a'中的符号,所以你应该在'test.c'后面写'-lSDL' **。我不知道为什么gcc没有在你的例子中抱怨,但迟早你会遇到这个问题。 – Shahbaz 2012-08-08 16:01:55

回答

2

Windows命令行程序使用main入口点,并将stdoutstderr文件句柄(通过printf语句)输出到控制台窗口。 Windows GUI程序使用WinMain入口点,并且不会将stdoutstderr文件句柄设置为转到控制台窗口(因为它们不初始化要输出到的控制台窗口),这就是为什么您看不到来自printf声明。

POSIX(Linux/Solaris上/ BSD/...)使用main切入点控制台和GUI应用程序和设置stdoutstderr正确,使他们出现在终端/控制台窗口。

SDL是一个跨平台的API,它简化了图形程序,所以在Windows上它使用了WinMain入口点,因此它可以创建一个窗口,其中显示的图形不会出现控制台窗口。 SDL WinMain调用main函数,因此您可以在所有平台上使用main入口点。

在过去,我发现:

test.exe | cat 

工作,但情况因人而异。

3

您写入stdoutstderr的所有内容都将分别重定向到exe文件所在的文件stdout.txtstderr.txt

为避免此重定向行为,您必须在调用SDL_Init后包含以下两行之后的

freopen("CON", "w", stdout); 
freopen("CON", "w", stderr); 

如果这不起作用,你可以检查SDL FAQs,还有更多的说明。

+0

这个建议不起作用..我会检查常见问题。 – 2012-08-10 04:33:55