2016-03-23 78 views
0

我在Linux上開發了一個有趣的SDL2應用程序,但是我也爲非Linux用戶構建了Windows,即使沒有測試它(我根本沒有Windows,從來沒有)。我使用mingw進行交叉編譯。一切都很好,但只有一件事。該應用程序有一些命令行開關/消息/幫助以及在C中使用簡單的printf()。但是,這根本不適用於Windows,根據用戶不會顯示輸出。我發現這個:setvbuf (stdout, NULL, _IONBF, 0);但它沒有幫助。另外,我發現在各種文檔中切換mingw和-mconsole,但由於我不太瞭解Windows,因此我不知道應該如何處理這個奇怪的系統(Windows)。基本上我希望類似Linux的解決方案:如果你從終端窗口開始,你可以看到標準輸出,但如果沒有,它們根本看不到,沒有窗口打開/顯示這些消息等。在win32上使用mingw的C printf()

回答

1

我知道沒有與linux程序具有相同行爲的替代方法。你的輸出將被定向到標準輸出並顯示在cmd中(並且可以通過管道被路由到其他進程標準輸入),但是如果你將在沒有cmd的情況下運行它,它將會打開一個額外的控制檯窗口輸出。

With -mwindows stdio不再鏈接到控制檯。您仍然可以重定向輸出,但是看不到它(例如,your_program.exe | cat將顯示輸出,但在標準窗口中沒有cat)。但是,該模式不會自動打開控制檯窗口。您可以手動創建控制檯(或繼承父進程的控制檯)並將stdout重定向到它(使用freopen("CONOUT$", "w", stdout)),但這不會是「真正的」stdio,並且您無法將其管理到其他進程(這對您來說可能仍然很好)。

+0

我明白了,謝謝。沒有-mwindows會自動打開新控制檯還是僅在第一個輸出處打開?我可以測試某種方式,我已經有一個控制檯或新_would_打開?是否緩衝了stdio?我想如果printf()的,然後只做了freopen()技巧,舊的消息丟失,對(我的意思是-mwindows)?一般情況下,可以在沒有-mwindows的情況下控制新打開的cmd窗口(並測試是否已經有一個窗口)?即,關閉它,或者測試我是否已經擁有,等等。對於許多可能的初學者問題,很抱歉。謝謝! –

+0

嗯,我不是Windows專家,但你們大多數人說似乎是正確的。我認爲大部分的困惑都是因爲Windows從根本上分離了控制檯和Windows應用程序。對於控制檯應用程序控制臺窗口甚至在您的'main'之前出現,並且在程序退出後自動關閉。對於Windows應用程序,您可以手動使用'AllocConsole'或'AttachConsole(-1)'附加到父級的進程控制檯,或者永遠使命令行切換到可選的狀態;那麼你需要重新附加stdin/stdout/stderr並禁用緩衝。 – keltar

+0

再次感謝!對我來說,你是一個窗口專家,尤其是與我自己相比:)我會照顧那些建議的功能。 –