c0ncatenate
c0ncatenate

Reputation: 60

SDL returns no output when I try to print statements using cout

I installed the MinGW version of SDL from their website.

I created a sample piece of code just to test if I could include the library without any errors.

#include <iostream>
#include <SDL.h>

using namespace std;

int main(int argc, char* argv[]) {

    if(SDL_Init(SDL_INIT_VIDEO) < 0) {
        cout << "SDL INIT FAILED" << endl;
        return 1;
    }

    cout << "SDL INIT SUCCEEDED" << endl;

    SDL_Quit();

    return 0;
}

I also created a Makefile:

#OBJS specifies which files to compile as part of the project
OBJS = main.cpp

#CC specifies which compiler we're using
CC = g++

#INCLUDE_PATHS specifies the additional include paths we'll need
INCLUDE_PATHS = -Isrc\includes

#LIBRARY_PATHS specifies the additional library paths we'll need
LIBRARY_PATHS = -Lsrc\lib

#COMPILER_FLAGS specifies the additional compilation options we're using
# -w suppresses all warnings
# -Wl,-subsystem,windows gets rid of the console window
COMPILER_FLAGS = -w -Wl,-subsystem,windows

#LINKER_FLAGS specifies the libraries we're linking against
LINKER_FLAGS = -lmingw32 -lSDL2main -lSDL2

#OBJ_NAME specifies the name of our exectuable
OBJ_NAME = main

#This is the target that compiles our executable
all : $(OBJS)
    $(CC) $(OBJS) $(INCLUDE_PATHS) $(LIBRARY_PATHS) $(COMPILER_FLAGS) $(LINKER_FLAGS) -o $(OBJ_NAME)

If I don't include the int argc, char* argv[] inside of int main() and try to ming32-make, it throws an error:

C:\Users\username\Documents\Projects\C++\SDL_test> mingw32-make

g++ main.cpp -Isrc\includes -Lsrc\lib -w -Wl,-subsystem,windows -lmingw32 -lSDL2main -lSDL2 -o main
c:/mingw/bin/../lib/gcc/x86_64-w64-mingw32/11.2.0/../../../../x86_64-w64-mingw32/bin/ld.exe: src\lib/libSDL2main.a(SDL_windows_main.o): in function `main_getcmdline':
/Users/valve/release/SDL2/SDL2-2.26.2-source/foo-x64/../src/main/windows/SDL_windows_main.c:82: undefined reference to `SDL_main'
collect2.exe: error: ld returned 1 exit status
mingw32-make: *** [Makefile:26: all] Error 1

When I include int argc, char* argv[], it doesn't give any errors but doesn't print anything either.

C:\Users\username\Documents\Projects\C++\SDL_test> mingw32-make
g++ main.cpp -Isrc\includes -Lsrc\lib -w -Wl,-subsystem,windows -lmingw32 -lSDL2main -lSDL2 -o main
C:\Users\username\Documents\Projects\C++\SDL_test>

When I use make instead of mingw32-make, the output remains the same.

I am using VSCode and I have included the header files and lib files in an src folder in the same directory as my script and also moved the SDL2.dll file in the root folder:

code files

My C++ Configuration on VSCode:

Compiler Path: C:\MinGW\bin\g++.exe
Compiler Arguments: 
IntelliSense mode: gcc-x64 (legacy) // Because using anything else says the the mode is incompatible with the compiler path.
Include path:
${workspaceFolder}/**
${workspaceFolder}/src/includes

I had also recieved SDL.h: file or directory not found errors before this and I fixed them by creating the Makefile.

Is there something I'm missing? Does SDL not output to stdout, because I've seen tutorials online and they are able to get outputs from cout fine on them.

I am expecting cout to work when I run the script.

Upvotes: 3

Views: 614

Answers (2)

c0ncatenate
c0ncatenate

Reputation: 60

EDIT: The issue was that I hadn't installed SDL2 the right way. I installed MSYS2 and used it to install MinGW-w64. I then used the Msys2 command-line interface to install SDL2 using these commands:

pacman -Syu
pacman -Su
pacman -S mingw-w64-x86_64-SDL2

This installed the header and lib files for SDL in their proper locations. I was then able to include those files in my code.

I changed the main function from int main(int argc, char* argv[]) to int WinMain(int argc, char* argv[]) because I'm on Windows and this helps get rid of the undefined reference to WinMain error.

My working code:

#include <iostream>
#include <SDL2/SDL.h>

using namespace std;

int WinMain(int argc, char* argv[]) {
    if(SDL_Init(SDL_INIT_VIDEO) < 0) {
        cout << "SDL INIT FAILED" << endl;
        return 1;
    }
    cout << "SDL INIT SUCCESSFUL" << endl;
}

Upvotes: 1

HolyBlackCat
HolyBlackCat

Reputation: 96579

-Wl,-subsystem,windows (aka -mwindows) hides the console window, and with it all output. Remove it, and use it only in the release builds.

-w suppresses all warnings

This is extremely unwise. Prefer -Wall -Wextra -Wdeprecated to enable most common warnings, plus -std=c++20 -pedantic-errors to enforce standard compliance (replace 20 with the latest version supported by your compiler).


As suggested by @keltar, you might be able to get output even from a program built with -mwindows if you redirect it to a file, using my_program.exe >output.txt.

Upvotes: 6

Related Questions