【问题标题】:C printf() on win32 with mingwC printf() on win32 with mingw
【发布时间】:2016-03-23 06:26:35
【问题描述】:

我在 Linux 上开发了一个有趣的 SDL2 应用程序,但是我也为非 Linux 用户构建了 Windows,即使没有对其进行测试(我根本没有 Windows,从来没有)。我为此使用mingw,交叉编译。一切都很好,但只有一件事。该应用程序有一些命令行开关/消息/帮助,以及在 C 中使用简单的 printf()。但是,根据用户的说法,这在 Windows 上根本不起作用,没有显示输出。我发现了这个:setvbuf (stdout, NULL, _IONBF, 0); 但它没有帮助。另外,我在各种文档和-mconsole 中发现了 mingw 的-mwindows 开关,但由于我不太了解 Windows,所以我不知道在这个对我来说很陌生的系统 (Windows) 上应该如何工作。基本上我想要与 Linux 类似的解决方案:如果你从终端窗口开始,你可以看到标准输出,但如果没有,它们根本看不到,没有窗口打开/显示这些消息等。

【问题讨论】:

    标签: windows printf mingw sdl-2


    【解决方案1】:

    我知道没有 Windows 替代品具有与 linux 程序相同的行为。

    如果没有-mwindows(除了许多其他东西),您的输出将被定向到标准输出并显示在 cmd 中(并且可以通过管道路由到其他进程标准输入),但是如果您在没有 cmd 的情况下运行它 - 它将打开一个额外的控制台窗口进行输出。

    -mwindows stdio 不再链接到控制台。您仍然可以重定向输出,但您看不到它(例如 your_program.exe | cat 将显示输出,但在标准窗口中没有 cat)。但是,此模式不会自动打开控制台窗口。您可以手动创建控制台(或继承父进程的控制台)并将标准输出重定向到它(使用freopen("CONOUT$", "w", stdout)),但这不会是“真正的”标准输出,您不能将它通过管道传输到其他进程(可能仍然很好给你)。

    【讨论】:

    • 我明白了,谢谢。如果没有 -mwindows,新控制台会自动打开还是仅在第一个输出时打开?我可以以某种方式测试我已经有一个控制台或新的打开吗? stdio 是否缓冲?我猜如果 printf() 和 freopen() 欺骗,旧消息丢失了,对吧(我的意思是 -mwindows)?一般来说,没有-mwindows可以控制新打开的cmd窗口(并测试是否已经有)?即,关闭它,或者测试我是否已经拥有等等。对于许多可能的初学者问题感到抱歉。谢谢!
    • 好吧,我不是 Windows 专家,但你们中的大多数人说的似乎是正确的。我认为大多数混淆发生是因为 Windows 从根本上将控制台和 Windows 应用程序分开。对于控制台应用程序,控制台窗口甚至出现在您的 main 之前,并在您的程序退出后自动关闭。对于 Windows 应用程序,您可以手动 AllocConsoleAttachConsole(-1) 附加到父进程控制台,或者进行命令行切换以选择这样做;然后你重新附加标准输入/标准输出/标准错误并在需要时禁用缓冲。
    • 再次感谢!对我来说,你是一个 Windows 专家,尤其是与我相比 :) 我会照顾那些建议的功能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-23
    相关资源
    最近更新 更多