-3

I am trying to install on my VS Code the SDL (https://www.libsdl.org), cause I am going through book "Will_Briggs_C++20_for_Lazy_Programmers_Quick,_Easy,_and_Fun_C++" which uses SDL. However in book dont use vs code, so I am trying to manage how to install by myself. I followed Youtube Tutorials (example: https://youtu.be/jUZZC9UXyFs), but got trouble - I included library, added SDL2.dll file, tried to write in Makefile commands, but compiler doesnt recognise every SDL command. Whats wrong? (screenshot in the end) Source files are from Chapter1, folder "ch1\test-setup": https://github.com/Apress/cpp20-for-lazy-programmers

My main file:

#include <iostream>
#include "include\SDL2\SDL.h"

using namespace std;

int main(int argc, char **argv)
{
    // Initial window setup
    SSDL_SetWindowTitle("Simple tester program");
    SSDL_SetWindowSize(500, 375);

    // Load and play music
    SSDL_Music music = SSDL_LoadMUS("media/457729__razor5__boss-battle-2-0.wav");
    SSDL_VolumeMusic(int(MIX_MAX_VOLUME * 0.50));
    SSDL_PlayMusic(music, SSDL_FOREVER);

    // Show image
    const SSDL_Image BULLSEYE = SSDL_LoadImage("media/bullseye.jpg");
    SSDL_RenderImage(BULLSEYE, 0, 0);

    // Set font and color
    const SSDL_Font FONT = SSDL_OpenSystemFont("georgiab.ttf", 28);
    SSDL_SetFont(FONT);
    SSDL_SetRenderDrawColor(BLACK);

    // Make a label in the middle, centered
    sout << " Success! You should see\n  the bullseye,\n";
    sout << "  read this message,\n";
    sout << "  and hear music.\n\n\n\n";
    sout << " Hit any key to end.\n";

    // End program
    SSDL_WaitKey();
    return 0;
}

and Makefile:

# A makefile that should work for any SSDL projects
# Adapt as needed
#  -- from the SDL (Simple SDL) library, but no copyright is claimed

EXECUTABLE      = a.out                     #Yes, you can call it this and it should run, even in MinGW

C_SOURCES       = $(wildcard *.c)           #We'll try to compile all .c, .cpp, and .cc files
CPP_SOURCES     = $(wildcard *.cpp)
CC_SOURCES      = $(wildcard *.cc)

C_OBJECTS       = ${C_SOURCES:      .c  =.o}#Now we know what .o files we'll need to create
CPP_OBJECTS     = ${CPP_SOURCES:   .cpp=.o}
CC_OBJECTS      = ${CC_SOURCES: .cc =.o}
ALL_OBJECTS     = $(notdir $(C_OBJECTS) $(CPP_OBJECTS) $(CC_OBJECTS))

#       Tell g++ where to find include files for SDL2, SSDL
INCLUDES        =   ../../external/SDL2-MinGW/SDL2/i686-w64-mingw32/include/SDL2        \
                    ../../external/SDL2-MinGW/SDL2_image/i686-w64-mingw32/include/SDL2  \
                    ../../external/SDL2-MinGW/SDL2_mixer/i686-w64-mingw32/include/SDL2  \
                    ../../external/SDL2-MinGW/SDL2_ttf/i686-w64-mingw32/include/SDL2    \
                    ../../external/SSDL/include                                         \
                    ../../external/fmt-master/include
                    
INCLUDE_FLAGS   = $(foreach dir,    $(INCLUDES),     -I$(dir))

LANGUAGE_FLAGS  = -std=gnu++2a              #Specify language standard: C++20
#                                           MinGW can't do the fmt library
#                                           unless we specify gnu++ to add gnu
#                                           extensions, so I'll just use it throughout.

#       Tell g++ where to find library files for SDL2, SSDL
#       Sometimes library order matters.  If this is a problem
#        in the future -- if it says it can't find something that's in one of the 
#        listed libraries -- try putting libraries in different order 

LIBRARIES       := mingw32 ssdl SDL2main SDL2 SDL2_image SDL2_TTF SDL2_Mixer 
LIBRARY_DIRS    :=  ../../external/SDL2-MinGW/SDL2/i686-w64-mingw32/lib         \
                    ../../external/SDL2-MinGW/SDL2_image/i686-w64-mingw32/lib   \
                    ../../external/SDL2-MinGW/SDL2_mixer/i686-w64-mingw32/lib   \
                    ../../external/SDL2-MinGW/SDL2_ttf/i686-w64-mingw32/lib     \
                    ../../external/SSDL/mingw
LIB_FLAGS       := $(foreach library,$(LIBRARIES),    -l$(library))
LIB_DIR_FLAGS   := $(foreach libdir, $(LIBRARY_DIRS), -L$(libdir))

ALL_FLAGS       := $(INCLUDE_FLAGS) $(LANGUAGE_FLAGS) $(LIB_FLAGS) $(LIB_DIR_FLAGS)

##########################################################################

all: $(EXECUTABLE)
    g++ -I src/include -L src/lib -o main main.cpp -lmingw32 -lSDL2main -lSDL2 
#changes from Youtube

$(EXECUTABLE): $(ALL_OBJECTS)
#   echo 'ALL_FLAGS :' $(ALL_FLAGS)
    g++ -o $@ $^ -g $(ALL_FLAGS) 
#   -g means:    support debugging
#   $^ means:    use all the objects
#   -o $@ means: let the output be called $(EXECUTABLE)

clean:
    rm -f $(EXECUTABLE)
    rm -f *.o
    rm -f core
    rm -f *.ncb *.sdf
    rm -r -f Debug Release .vs Backup


Tried to find info in StackOver and in SDL issues (https://github.com/libsdl-org/SDL/issues), but no similar questions. Probably Its an easy fix, but I dont understand it.

Errors

Andreas Wenzel
  • 22,760
  • 4
  • 24
  • 39
aret
  • 3
  • 2
  • 1
    Please do not post pictures of errors, these are not readable for visually impaired. Instead run your code through compiler and post its output as text. – blami Dec 21 '22 at 01:16

1 Answers1

1

Citing from the book Getting Started chapter:

Most programs in the first half of this book use the SDL and SSDL libraries.

Identifiers starting with SSDL_ come from another library called SSDL (which is seemingly wrapper over SDL). You need to install that as well in order to compile these examples.

According to Notes (I don't have the book, just looked at preview in Springer) in the Appendix A there are instructions how to setup your environment and install both libraries. Seems that library source is in the repo itself, in external/SSDL directory here.

blami
  • 6,588
  • 2
  • 23
  • 31
  • As I see, there is no division between SDL and SSDL - its same thing https://wiki.libsdl.org/SDL2/FrontPage In Appendix A there is no useful info, as I am using Vs code, which have different installation instructions, than VS Studio from the book Edit: Wait, maybe you are right, found just now this project: https://github.com/chebert/ssdl Does book uses this? – aret Dec 21 '22 at 01:22
  • @aret no they are not same thing. SSDL is invention of book author (as per copyright headers in the repository) that uses SDL and hides some stuff from programmer - see the link I posted. You need both libraries. – blami Dec 21 '22 at 01:26
  • No, the book uses different thing called SSDL too. It was created by the book author and resides in repo `external/SSDL` directory. – blami Dec 21 '22 at 01:28
  • Omg, got it, thanks for help, seems I need now to check the all readme´s... – aret Dec 21 '22 at 01:33