【问题标题】:C++ / SDL Debugging with console window使用控制台窗口进行 C++/SDL 调试
【发布时间】:2011-12-12 23:20:58
【问题描述】:

我正在玩一些 OpenGL,使用 SDL 来处理窗口/输入等。目前我正在向 HUD 显示我想看到的任何信息。好吧,这太麻烦了,我想知道是否有一种简单的方法可以打开一个单独的控制台窗口来向我报告这些信息。我还是 C++ 的新手,所以如果这很明显的话,请放轻松。

【问题讨论】:

    标签: c++ console sdl


    【解决方案1】:

    以下代码适用于 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 函数。

    【讨论】:

      【解决方案2】:

      在项目属性中的 Linker -> System 中,检查 SubSystem 是否为“Console (/SUBSYSTEM:CONSOLE)”。这会导致在您运行程序时弹出一个单独的控制台窗口。如果您当前的入口点不是main,那么如果您这样做,则需要将其更改为该入口点。

      【讨论】:

      • 如果我在文本编辑器中编写应用程序代码然后通过 Cmake 创建可执行文件,这将如何应用?
      • @Speldosa:您需要找到允许您传递链接器标志的 CMake 选项,然后将“/SUBSYSTEM:CONSOLE”传递给链接器。
      • set_target_properties(youapplication PROPERTIES LINK_FLAGS "/SUBSYSTEM:CONSOLE") 或做: set(CMAKE_EXE_LINKER_FLAGS "/SUBSYSTEM:CONSOLE") 作为全局设置。
      【解决方案3】:

      如果您从命令行运行并使用printf(),您应该会看到消息已注销到终端窗口。否则,您可以登录到文件并在 *nix 样式框上使用 tail -f 来查看显示的输出。

      您使用的是什么环境?大多数 IDE 也会在其调试输出窗口中显示此输出。

      【讨论】:

      • 我将如何实际创建此控制台窗口?目前我正在使用 SDL 生成的窗口。
      • 你在哪个平台上工作?如果是 Windows,只需运行 cmd.exe 并从那里运行您的程序,在 Mac 上使用终端或在 linux 上您选择的任何终端。
      猜你喜欢
      • 2011-05-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多