2012-05-11 70 views
4

我有一個我在Windows上編譯的.exe文件。但是當我從命令行運行它時,我沒有看到我的程序輸出到std :: cout或std :: cerr的任何東西。即使在命令行返回提示(這是一個GUI程序,並且在我按下退出按鈕之前不會退出)之後,該程序仍會繼續運行並繼續運行。我怎樣才能看到我的程序的輸出?請參閱std :: .exe的文件

我使用cmake使Visual Studio項目,然後我用的MSBuild編譯。

回答

4

最簡單的方法是重建程序作爲控制檯應用程序。 link.exe的選項需要爲/SUBSYSTEM:CONSOLE而不是/SUBSYSTEM:WINDOWS;大概有一個直接的方式來指定這在cmake中。

這種變化應該不會影響你的GUI可言,但它會導致如果這一進程尚未與一個關聯的Windows分配一個控制檯。而且,命令行shell通常會在繼續之前等待控制檯應用程序退出。

另一種方法是調用AllocConsole以明確創建一個新的控制檯,或者如果要使用現有的控制檯,則需要AttachConsole。或者,當然,您可以將輸出發送到日誌文件。

附加

根據谷歌搜索,你可以通過添加下面一行到你的源代碼生成程序作爲控制檯應用程序:

#pragma comment(linker, "/SUBSYSTEM:CONSOLE") 

這可能是最簡單的解決方案。如果您只希望控制檯進行調試構建,則可以將它放在#if塊中。

又見如果你想永久改變你的應用程序中顯示此信息CMake: How to use different ADD_EXECUTABLE for debug build?

+0

我在哪裏可以指定/ SUBSYSTEM:CONSOLE選項?那是在我的.sln文件中? –

+0

我已經更新了我的答案。希望有所幫助。 –

+0

真棒。謝謝 –

1

Windows不支持雙模式。這意味着當你運行gui時,你無法獲得輸出到你運行應用程序的控制檯。

+0

認真嗎?那個人很奇怪。 –

+1

實際上,沒有什麼能夠阻止控制檯應用程序呈現圖形用戶界面,並且GUI應用程序也可以將輸出發送到啓動的控制檯 - 但它必須有意識地這樣做,它不會「只發生」 。 –

+0

@哈利我假設你會提出一個解決方案的提問者,所以我也可以學習? – Hameed

5

Harry Johnston's answer通過點上。我會建議後者的做法他認爲,由於開關您的應用程序針對控制檯子系統將導致其總是分配和在啓動時顯示控制檯窗口,即使你不希望它。

不過,我注意到你提到你希望顯示std::cerr輸出,這意味着你可能只有在這個信息用於調試目的感興趣。在這種情況下,我的建議是打電話給OutputDebugString function,而不是輸出到std::coutstd::cerr。然後,您可以使用一個小工具(如DebugView)來監視應用程序的調試輸出。它發送到OutputDebugString函數的所有內容都將顯示在DebugView窗口中。

如果要使用此設置以最小的改動現有的代碼庫,你其實可以重定向數據流的輸出像std::coutstd::cerr到調試器,就好像你叫OutputDebugString功能。關於如何做到這一點的建議可以在this questionthis blog post的答案中找到。看到輸出

0

一種方法是運行:

program.exe > output.txt 

,然後監視輸出該文件。或使用管道進行查看:

program.exe | find /v "" 

要同時監視錯誤輸出,你可以使用

program.exe > output.txt 2>&1 

program.exe 2>&1 | find /v "" 

我想通了由Microsoft留下了很多的想象和基於文檔 更實用的例子herehere

這有助於我看到來自我(和其他人)Windows應用程序的「隱藏」stdout和stderr消息。看到有些程序中留下了什麼信息很有意思,但通常看不到。