2011-12-12 37 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函数。