Comment imprimer sur la console pendant l’exécution d’un programme SDL 2?

Je voudrais imprimer des trucs de débogage sur la console en exécutant mon programme SDL 2, mais cela semble impossible. printf("Hi!\n") et SDL_Log("Hi!\n") ne vont pas me faire du bien.

J’ai même essayé d’imprimer avant d’initialiser SDL (et après l’avoir quitté), mais en vain. Il semble que l’ import de la bibliothèque SDL rend impossible toute impression sur la console.

Voici les parameters avec lesquels je comstack, car il est possible que cela puisse avoir quelque chose à voir avec cela:

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

Des idées?

Donc, j’ai compris ce qui m’empêchait de voir la sortie. Ces options de compilation

-Wl,-subsystem,windows

essentiellement désactiver la fenêtre de la console, empêchant l’affichage de la sortie. C’est bon quand un jeu est fini, mais terrible pour le débogage. Donc, je suis allé de l’avant et supprimé ces options de compilation et maintenant, printf() et SDL_Log() fonctionnent parfaitement bien.

J’utilise cette approche pour la console de débogage:

 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 provient de Comment un processus Win32 peut-il obtenir le pid de son parent? ). Fonctionne très bien, mais je ne peux toujours pas le faire fonctionner avec grep / findstr etc. (c.-à-d. ‘Vrai’ stdout avec la redirection de canal).

Étant donné que SDL2 utilise le sous-système Windows, vous pouvez ouvrir la fenêtre de la console à l’aide de l’API Win32.

Selon cet article de blog :

 #include  #include  #include  #include  #include  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(), ... } 

J’espère que cela t’aides.