2010-04-13 15 views
13

Z jakiegokolwiek powodu std :: cout nie wyświetla niczego z moją aplikacją. Poniżej znajduje się opis mojego środowiska programistycznego.Co może wyjaśnić, że std :: cout nie wyświetla niczego?

Pracuję nad aplikacją Qt przy użyciu Qt Creator. Ponieważ program Qt Creator nie może zostać uruchomiony z mojej stacji roboczej (XP64), obecnie rozwijam go za pomocą Visual Studio 2008 i wtyczki Qt (przez zaimportowanie pliku projektu .pro). Wszystko wydaje się w porządku, a aplikacja działa.

W niektórych przypadkach (w zależności od argumentów wiersza poleceń) nie chcę uruchamiać interfejsu HIM, wystarczy wyświetlić kilka zdań w wierszu polecenia (na przykład wymagane wiersze poleceń).

Nie otrzymuję żadnego błędu, ale nic nie jest wyświetlane. odpowiedni kod, który jestem pewien prowadzony jest (klasyczny) następujące:

std::cout << "is this going to be displayed ?" << std::endl; 

Czy masz jakiś pomysł, dlaczego nic nie jest wyświetlane?

+0

Dlaczego nie umieszczasz punktu przerwania w tej linii i nie widzisz, czy ten fragment kodu jest naprawdę wykonywany czy nie ...? czy to jest wykonane ...? –

+0

Jest wykonywany. –

+0

Miałem podobny problem, ale to dlatego, że napisałem 'std :: cout <<" Liczba kluczy SIFT: "+ siftImageKeypoints.size() << std :: endl;'. Rozdzielczość miała zastąpić + z <<. –

Odpowiedz

16

OK, odpowiedź znaleziona. Prosta odpowiedź, oczywiście, jak zawsze w przypadku napotkania takich problemów. Michael Aaron był na właściwych torach.

Po prostu zmiana podsystemu na konsolę w konfiguracji projektu (/ Właściwości konfiguracji/Linker/System) sprawia, że ​​wszystko działa. GUI wciąż działa, ale z konsolą w tle. Poradzę sobie z tym.

+0

Jest jeszcze coś nie tak z tym, ponieważ mogę łatwo zobaczyć 'cout', którego zwykle nie widzę, jeśli używam powłoki cygwin do uruchomienia programu. Jest tak prawdopodobnie dlatego, że większość programów WinAPI używa 'WriteConsole' do wyprowadzania danych zamiast' cout' i 'stdout'. –

4

System Windows rozróżnia aplikacje konsoli i aplikacje GUI i domyślnie nie tworzy konsoli dla aplikacji GUI (see this page from MSDN). Możesz użyć AllocConsole, aby ją utworzyć.

+0

Próbowałem uruchomić go z "cmd" –

+0

@Benoit, nie ma znaczenia, gdzie go uruchomić ... zależy całkowicie od aplikacji, sam (czy używa WinMain lub innych funkcji związanych z GUI Windows). –

+0

Tak, rozumiem to teraz. –

0

Być może to nie jest linia std :: cout, która sprawia, że ​​nie jest wyświetlana, ale funkcja zawierająca ją. Może to w ogóle nie jest wywoływane, dlatego std :: cout nie działa.

14

W systemie Windows programy zwykle są budowane jako SUBSYSTEM:WINDOWS application or as SUBSYSTEM:CONSOLE.

Programy zbudowane z PODSYSTEMU: KONSOLA powinny być aplikacjami tekstowymi. W przypadku tego typu aplikacji stdout i stderr drukują do konsoli, z której zostały uruchomione, tworząc w razie potrzeby nową konsolę.

W przeciwieństwie do aplikacji SUBSYSTEM: WINDOWS nie przejmuj się konsolą. Nadal możesz pisać na stdout i stderr, ale nigdzie nie idą. Możesz użyć AllocConsole, aby utworzyć konsolę do drukowania, ale pamiętaj, że będzie to zawsze drukowane do nowo utworzonego okna konsoli, a nie do okna konsoli, z którego uruchomiłeś program.

Jedna sztuczka dla aplikacji SUBSYSTEM: WINDOWS polega na tym, że nawet jeśli nie ma konsoli, nadal można podłączyć stdout i stderr. Więc na standardowe wyjście rury, można zrobić:

YourApplication.exe > output.txt 

lub jeśli masz cat (lub równoważnym):

YourApplication.exe | cat 

Należy również pamiętać, że tam naprawdę nie jest jakaś różnica między podsystem: aplikacje Windows i podsystem: Aplikacje CONSOLE inne niż sposób, w jaki system Windows traktuje je, tworząc proces. (Możesz tworzyć okna w PODSYSTEMU: aplikacje CONSOLE.) You therefore can easily switch between SUBSYSTEM types (na przykład, aby użyć PODSYSTEMU: KONSOLA dla kompilacji debugowania i PODSYSTEMU: WINDOWS dla wersji release).

+0

Nie wiedziałem o tym. Dzięki. – msandiford

+0

, aby uzyskać stderr też: 'YourApplication.exe 2> i 1 | cat' – JDiMatteo

8

Spróbuj

CONFIG + = konsola

w pliku .pro.

+0

Działa, dzięki. – Calvin1602

+0

Nie zapomnij oznaczyć jako odpowiedź, jeśli jesteś zadowolony z tej odpowiedzi i uważasz, że rozwiązuje ona Twój problem (co oczywiście robisz). – rbaleksandar

Powiązane problemy