2012-05-11 4 views
4

У меня есть .exe-файл, который я скомпилировал на окнах. Но когда я запускаю его из командной строки, я не вижу ничего из того, что моя программа выводит на std :: cout или std :: cerr. Программа запускается и продолжает работать даже после того, как командная строка вернется в приглашение (это программа графического интерфейса пользователя и не завершается, пока я не нажму кнопку «Выход»). Как я могу видеть вывод моей программы?См. Std :: cout .exe

Я использую cmake для создания визуального проекта студии, который затем компилирую с помощью msbuild.

ответ

4

Самый простой способ - перестроить программу как консольное приложение. Вариант link.exe должен быть /SUBSYSTEM:CONSOLE вместо /SUBSYSTEM:WINDOWS; по-видимому, есть простой способ указать это в cmake.

Это изменение не должно отрицательно сказываться на вашем графическом интерфейсе, но это приведет к тому, что Windows выделит консоль, если процесс еще не связан с ней. Кроме того, оболочки командной строки обычно ждут завершения консольных приложений перед продолжением.

Другой подход заключается в вызове AllocConsole, чтобы явно создать новую консоль, или AttachConsole, если вы хотите использовать существующую. Или, конечно, вы можете отправить вывод в файл журнала.

Дополнительная

Согласно поиска Google, вы можете создать программу как консольное приложение, добавив следующую строку в ваш исходный код:

#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::cout или std::cerr. Затем вы можете использовать небольшую утилиту, например DebugView, для контроля вывода отладки вашего приложения. Все, что он отправляет в функцию OutputDebugString, будет отображаться в окне DebugView.

Если вы хотите использовать эту установку с минимальными изменениями в существующих базы кода, вы можете перенаправить вывод потоков, как std::cout и std::cerr в отладчик, так же, как если бы вы назвали OutputDebugString функцией. Совет о том, как это сделать, можно найти в ответах на this question и в this blog post.

0

Один из способов увидеть выход является запуск:

program.exe > output.txt 

, а затем контролировать этот файл на выходе. Или использовать трубу для его просмотра:

program.exe | find /v "" 

также контролировать вывод ошибок вы могли бы использовать

program.exe > output.txt 2>&1 

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

Я понял это на основе документации по Microsoft, что оставляет много воображения и от гораздо более практические примеры here и here.

Это помогает мне видеть «скрытые» сообщения stdout и stderr от приложений Windows (и других людей). Интересно посмотреть, какие сообщения остались в некоторых программах, но обычно их не видно.

Смежные вопросы