2011-12-12 78 views
6

我正在玩一些OpenGL,使用SDL來處理窗口/輸入等。目前,我正在顯示任何我想看到的HUD信息。那麼,這是越來越繁瑣,我想知道是否有一個簡單的方法來打開一個單獨的控制檯窗口向我報告這些信息。我仍然對C++不熟悉,所以如果這是一個明顯的例子,那就輕鬆點。C++/SDL使用控制檯窗口進行調試

回答

4

在項目屬性中的鏈接器 - >系統中,檢查子系統是否爲「控制檯(/ SUBSYSTEM:CONSOLE)」。這會導致在運行程序時出現單獨的控制檯窗口。如果你當前的入口點不是main,那麼如果你這樣做,你需要改變它。

+0

這是如何適用於例如我在文本編輯器中編寫我的應用程序然後通過Cmake創建可執行文件? – Speldosa

+0

@Speldosa:您需要找到允許您傳遞鏈接器標誌的CMake選項,然後將「/ SUBSYSTEM:CONSOLE」傳遞給鏈接器。 –

+0

set_target_properties(youapplication性能LINK_FLAGS 「/子系統:CONSOLE」)或做:集(CMAKE_EXE_LINKER_FLAGS 「/子系統:CONSOLE」)作爲一個全球性的設置。 –

0

如果您從命令行運行並使用printf(),則應該看到消息註銷到您的終端窗口。否則,您可以登錄到文件並在* nix樣式框上使用tail -f來查看顯示的輸出。

你在使用什麼環境?大多數IDE將在其調試輸出窗口中顯示此輸出。

+0

雖然我會怎樣創建這個控制檯窗口?目前,我正在使用由SDL生成的窗口。 – grep

+0

你在做什麼平臺?如果是Windows,只需運行cmd.exe並從那裏運行程序,在Mac上使用終端或在您選擇的任何終端上運行Linux。 –

6

以下代碼適用於Windows。我總是覺得很方便的保持周圍按需創建控制檯窗口的能力:

int hConHandle; 
    intptr_t lStdHandle; 
    CONSOLE_SCREEN_BUFFER_INFO coninfo; 
    FILE *fp; 

    // allocate a console for this app 
    AllocConsole(); 

    // set the screen buffer to be big enough to let us scroll text 
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &coninfo); 
    coninfo.dwSize.Y = 500; 
    SetConsoleScreenBufferSize(GetStdHandle(STD_OUTPUT_HANDLE), coninfo.dwSize); 

    // redirect unbuffered STDOUT to the console 
    lStdHandle = (intptr_t)GetStdHandle(STD_OUTPUT_HANDLE); 
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); 
    fp = _fdopen(hConHandle, "w"); 
    *stdout = *fp; 
    setvbuf(stdout, NULL, _IONBF, 0); 

    // redirect unbuffered STDIN to the console 
    lStdHandle = (intptr_t)GetStdHandle(STD_INPUT_HANDLE); 
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); 
    fp = _fdopen(hConHandle, "r"); 
    *stdin = *fp; 
    setvbuf(stdin, NULL, _IONBF, 0); 

    // redirect unbuffered STDERR to the console 
    lStdHandle = (intptr_t)GetStdHandle(STD_ERROR_HANDLE); 
    hConHandle = _open_osfhandle(lStdHandle, _O_TEXT); 
    fp = _fdopen(hConHandle, "w"); 
    *stderr = *fp; 
    setvbuf(stderr, NULL, _IONBF, 0); 

    // make cout, wcout, cin, wcin, wcerr, cerr, wclog and clog point to console as well 
    std::ios::sync_with_stdio(); 

    //Keep our window in focus 
    SetForegroundWindow(m_hWnd);      // Slightly Higher Priority 
    SetFocus(m_hWnd);         // Sets Keyboard Focus To The Window 

此代碼假定HWND是在一個名爲m_hWnd變量;它是從我使用的類包裝器中複製的。但是,如何從SDL獲得HWND取決於您。

要釋放控制檯,稱之爲:

FreeConsole(); 

AllocConsoleFreeConsole是Win32 API函數。