Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SDL 2程序运行时如何打印到控制台?_C++_Windows_Mingw_Sdl 2 - Fatal编程技术网

C++ SDL 2程序运行时如何打印到控制台?

C++ SDL 2程序运行时如何打印到控制台?,c++,windows,mingw,sdl-2,C++,Windows,Mingw,Sdl 2,我想在运行SDL2程序时将一些调试内容打印到控制台,但这似乎是不可能的printf(“Hi!\n”)和SDL\u Log(“Hi!\n”)这两种方法对我没有任何好处 我甚至在初始化SDL之前(以及退出SDL之后)尝试过打印,但都没有用。似乎仅仅导入SDL库就无法将任何内容打印到控制台 以下是我编译时使用的参数,因为可能与此有关: g++ hello.cc -IC:\mingw_dev_lib\include\SDL2 -LC:\mingw_dev_lib\lib -w -Wl,-subsyste

我想在运行SDL2程序时将一些调试内容打印到控制台,但这似乎是不可能的
printf(“Hi!\n”)
SDL\u Log(“Hi!\n”)
这两种方法对我没有任何好处

我甚至在初始化SDL之前(以及退出SDL之后)尝试过打印,但都没有用。似乎仅仅导入SDL库就无法将任何内容打印到控制台

以下是我编译时使用的参数,因为可能与此有关:

g++ hello.cc -IC:\mingw_dev_lib\include\SDL2 -LC:\mingw_dev_lib\lib -w -Wl,-subsystem,windows -lmingw32 -lSDL2main -lSDL2 -lSDL2_image -std=c++11

有什么想法吗?

所以,我找到了阻止我看到输出的原因。这些是编译选项

-Wl,-子系统,windows


本质上禁用控制台窗口,防止显示输出。这对于游戏结束时很有用,但对于调试来说却很糟糕。因此,我继续删除了这些编译选项,现在
printf()
SDL\u Log()
工作得非常好。

我使用这种方法调试控制台:

static ULONG_PTR GetParentProcessId() // By Napalm @ NetCore2K
{
    ULONG_PTR pbi[6];
    ULONG ulSize = 0;
    LONG (WINAPI *NtQueryInformationProcess)(HANDLE ProcessHandle, ULONG ProcessInformationClass,
            PVOID ProcessInformation, ULONG ProcessInformationLength, PULONG ReturnLength); 
    *(FARPROC *)&NtQueryInformationProcess = 
        GetProcAddress(LoadLibraryA("NTDLL.DLL"), "NtQueryInformationProcess");
    if(NtQueryInformationProcess){
        if(NtQueryInformationProcess(GetCurrentProcess(), 0,
                    &pbi, sizeof(pbi), &ulSize) >= 0 && ulSize == sizeof(pbi))
            return pbi[5];
    }
    return (ULONG_PTR)-1;
}

static void _windows_init_console(int argc, char **argv) {
    (void)argc, (void)argv;
    ULONG_PTR ppid = GetParentProcessId();
    if(ppid == (ULONG_PTR)-1) {
        AllocConsole();
    } else {
        AttachConsole(ppid);
    }

    freopen("CONIN$", "r", stdin); 
    freopen("CONOUT$", "w", stdout); 
    freopen("CONOUT$", "w", stderr); 
}

GetParentProcessId
来自)。工作非常好,但我仍然无法使它与
grep
/
findstr
等一起工作(即带有管道重定向的“true”标准)。

由于SDL2使用windows子系统,因此可以使用Win32 API打开控制台窗口

据此:

#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
//SDL2初始化代码。。。
//就在事件循环之前
allocsole();
HANDLE HANDLE\u out=GetStdHandle(STD\u OUTPUT\u HANDLE);
int hCrt=_open_osfhandle((长)handle_out,_O_TEXT);
文件*hf_out=_fdopen(hCrt,“w”);
setvbuf(hf_out,NULL,_IONBF,1);
*标准输出=*高频输出;
HANDLE HANDLE\u in=GetStdHandle(标准输入\u HANDLE);
hCrt=_open_osfhandle((长)handle_in,_O_TEXT);
文件*hf_in=_fdopen(hCrt,“r”);
setvbuf(hf_-in,NULL,_-IONBF,128);
*stdin=*hf_英寸;
//使用控制台就像使用普通控制台一样-printf(),getchar()。。。
}

希望这能有所帮助。

因为在使用mingw时,window中的SDL2仍然存在这个问题,所以我找到了一个更好的解决方案,并进行了测试

不要像其他人建议的那样删除-mwindows构建选项。您应该添加`pkg config--libs SDL2`作为构建选项,但对于调试构建选项,您还应该在末尾添加-mconsole。它应该位于-mwindows标志之后

调试:`pkg config--libs SDL2`-mconsole
发布:`pkg配置--libs SDL2`

注意:我是为Windows 10、SDL2 v2.0.9、Msys64、mingw64、代码::Blocks 17.12编译的
`pkg config--libs SDL2`扩展为:
-LC:/msys64/mingw64/lib-lmingw32-lSDL2main-lSDL2-mwindows

参考文献:


这可能是sdl2main库造成的。通常情况下,在正常的sdl程序中并不需要它,但它会导致调试输出丢失的问题…@tp1您是建议我删除sdl2main吗?我发现最接近这个的是
libSDL2main.a
,删除该文件会导致更多问题。这可能是您在SDL中所做的事情或与平台相关的问题。我现在正在使用SDL2,在运行时通过cout立即打印没有问题。我还在Windows上使用MSYS2。这不是很明确,但可能会有所帮助:我从其他网站上找到了它,所以我会继续回答我自己的问题。如果有人使用pkg config,你必须保存输出并删除-mwindowsThank you!这种行为毁了我的一周
#include <stdio.h>
#include <io.h>
#include <fcntl.h>
#include <windows.h>
#include <SDL2/SDL.h>

int main(int argc, char *argv[])
{
    // SDL2 init code...

    // Just before the event loop
    AllocConsole();

    HANDLE handle_out = GetStdHandle(STD_OUTPUT_HANDLE);
    int hCrt = _open_osfhandle((long) handle_out, _O_TEXT);
    FILE* hf_out = _fdopen(hCrt, "w");
    setvbuf(hf_out, NULL, _IONBF, 1);
    *stdout = *hf_out;

    HANDLE handle_in = GetStdHandle(STD_INPUT_HANDLE);
    hCrt = _open_osfhandle((long) handle_in, _O_TEXT);
    FILE* hf_in = _fdopen(hCrt, "r");
    setvbuf(hf_in, NULL, _IONBF, 128);
    *stdin = *hf_in;

    // use the console just like a normal one - printf(), getchar(), ...
}