C++ Fundamentals - Build does not always show changes to code?

Hi All

I am on a win 11 laptop and using vsCode with raylib. I am noticing two things that make this course difficult for me:

1: When I change code and choose ‘F5 - Start debugging’, often the changes I have made do not show as changed in the application when it is run? For some reason this can take some time (sometimes turning off my laptop and trying again). Dies anyone know how to solve this?

2: When debugging, I cannot view any watches? My paths are all correct and my environment paths are set i.e mingw & gdb can be found easily?

This is so frustrating as it means that even the smallest updates take time after time of trying to see a change?

Many thanks in advance.

Hello Jay70,

While I’m not sure what’s causing the compiled code to not update in the produced exe file (which ends up getting used for debugging). One potential way to reduce the stress and force an update is to delete the exe file generated from the last debugging session and then run Start Debugging. This forces the compiler to generate a fresh exe file to be used.

As far as watching is concerned, I have never got this working myself and am not sure why that is the case. You can use a combination of breakpoints or creating your own logging code (using printf statements, for example) as an alternative, though.

Hey Tuomo_T

Thanks for the speedy response. I noticed yesterday that if I delete all the exe files, then click F5 (run with debugging) i get a message saying it cannot run as main.exe is missing. This suggests that it is not doing a recompile? Any ideas as to why?

Also, it seems to only recompile the entire codebase if I make changes to main.cpp and save these changes. Then any code change in character.cpp seems to appear in the run app?

This is driving me crazy.

What message(s) do you get in your terminal when you run with debugging? Also, what build method are you using when you try Terminal > Run Task?

The behaviour you’re describe is indeed odd, as this should not be happening with our template project.

Hi Tuomo_T

Just opened vsCode and then selected “Start with debugging”.

This is what the output reads

No current configuration is defined in the workspace state. Assuming 'Default'.
No target defined in the workspace state. Assuming 'Default'.
Dropping various extension output files at c:\Users\jason\AppData\Roaming\Code\User\workspaceStorage\316f3330ea1294df8a11d5d6f6cabffa\ms-vscode.makefile-tools
Logging level: Normal
Configurations cached at c:\Users\jason\AppData\Roaming\Code\User\workspaceStorage\316f3330ea1294df8a11d5d6f6cabffa\ms-vscode.makefile-tools\configurationCache.log
No path to the makefile is defined in the settings file.
No folder path to the makefile is defined in the settings file.
Always pre-configure: false
Always post-configure: false
Dry-run switches: '--always-make', '--keep-going', '--print-directory'
No current launch configuration is set in the workspace state.
Default launch configuration: MIMode = undefined,
                    miDebuggerPath = undefined,
                    stopAtEntry = undefined,
                    symbolSearchPath = undefined
Configure on open: true
Configure on edit: true
Configure after command: true
Only .PHONY targets: false
Save before build or configure: true
Build before launch: true
Clear output before build: true
Ignore directory commands: true
compile_commands.json path: null
Deduced command 'make.exe ' for configuration "Default"
Saving opened files before build.
Configuring from cache: c:\Users\jason\AppData\Roaming\Code\User\workspaceStorage\316f3330ea1294df8a11d5d6f6cabffa\ms-vscode.makefile-tools\configurationCache.log
Load configuration from cache elapsed time: 0.01
Generating in the background a new configuration cache with command: 'make.exe --dry-run --always-make --keep-going --print-directory'
Writing the dry-run output: c:\Users\jason\AppData\Roaming\Code\User\workspaceStorage\316f3330ea1294df8a11d5d6f6cabffa\ms-vscode.makefile-tools\dryrun.log
Generating dry-run elapsed time: 0.183
The make dry-run command failed.
IntelliSense may work only partially or not at all.
make[1]: *** No rule to make target 'main.c', needed by 'game'.
make: *** [Makefile:378: all] Error 2


You can see the detailed dry-run output at c:\Users\jason\AppData\Roaming\Code\User\workspaceStorage\316f3330ea1294df8a11d5d6f6cabffa\ms-vscode.makefile-tools\dryrun.log
Make sure that the extension is invoking the same make command as in your development prompt environment.
You may need to define or tweak a custom makefile configuration in settings via 'makefile.configurations' like described here: [link]
Also make sure your code base does not have any known issues with the dry-run switches used by this extension (makefile.dryrunSwitches).
If you are not able to fix the dry-run, open a GitHub issue in Makefile Tools repo: https://github.com/microsoft/vscode-makefile-tools/issues
Preprocessing: "c:\Users\jason\AppData\Roaming\Code\User\workspaceStorage\316f3330ea1294df8a11d5d6f6cabffa\ms-vscode.makefile-tools\dryrun.log"
Preprocess elapsed time: 0
Parsing for IntelliSense.
Updating the CppTools IntelliSense Configuration Provider.
Parsing dry-run output for CppTools Custom Configuration Provider.
Parsing for IntelliSense elapsed time: 0.007
Parsing for launch targets.
No launch configurations have been detected.
Complete list of launch targets: 
Parsing for launch targets elapsed time: 0.007
Generating parse content for build targets.
Generating targets information with command: 'make.exe all --print-data-base --no-builtin-variables --no-builtin-rules --question'
Writing the dry-run output: c:\Users\jason\AppData\Roaming\Code\User\workspaceStorage\316f3330ea1294df8a11d5d6f6cabffa\ms-vscode.makefile-tools\targets.log
Generating dry-run elapsed time: 0.191
Parsing for build targets from: "c:\Users\jason\AppData\Roaming\Code\User\workspaceStorage\316f3330ea1294df8a11d5d6f6cabffa\ms-vscode.makefile-tools\targets.log"
Found the following 4 build targets defined in the makefile: .PHONY;all;clean;game
Complete list of build targets: .PHONY;all;clean;game
Parsing build targets elapsed time: 0.012
Configure finished. The status for all the subphases that ran:
loadFromCache: return code = 0, elapsed time = 0.01
generateParseContent: return code = 2, elapsed time = 0.183
preprocessParseContent: return code = 0, elapsed time = 0
parseIntelliSense: return code = 0, elapsed time = 0.007
parseLaunch: return code = 0, elapsed time = 0.007
dryrunTargets: return code = 2, elapsed time = 0.191
parseTargets: return code = 0, elapsed time = 0.012
Configure succeeded.
Configure elapsed time: 0.418

This is what the Terminal shows:

PS C:\Users\jason\Documents\c++course\Clashy Clash>  & 'c:\Users\jason\.vscode\extensions\ms-vscode.cpptools-1.18.5-win32-x64\debugAdapters\bin\WindowsDebugLauncher.exe' '--stdin=Microsoft-MIEngine-In-xzgaiip1.5w0' '--stdout=Microsoft-MIEngine-Out-uda2yrpd.ahu' '--stderr=Microsoft-MIEngine-Error-e5x4apts.e3p' '--pid=Microsoft-MIEngine-Pid-iz1rck50.aix' '--dbgExe=C:/raylib/w64devkit/bin/gdb.exe' '--interpreter=mi' 
INFO: Initializing raylib 5.0
INFO: Platform backend: DESKTOP (GLFW)
INFO: Supported raylib modules:
INFO:     > rcore:..... loaded (mandatory)
INFO:     > rlgl:...... loaded (mandatory)
INFO:     > rshapes:... loaded (optional)
INFO:     > rtextures:. loaded (optional)
INFO:     > rtext:..... loaded (optional)
INFO:     > rmodels:... loaded (optional)
INFO:     > raudio:.... loaded (optional)
INFO: DISPLAY: Device initialized successfully
INFO:     > Display size: 3840 x 2160
INFO:     > Screen size:  512 x 512
INFO:     > Render size:  512 x 512
INFO:     > Viewport offsets: 0, 0
INFO: GLAD: OpenGL extensions loaded successfully
INFO: GL: Supported extensions count: 224
INFO: GL: OpenGL device information:
INFO:     > Vendor:   Intel
INFO:     > Renderer: Intel(R) UHD Graphics 630
INFO:     > Version:  3.3.0 - Build 25.20.100.6444
INFO:     > GLSL:     3.30 - Build 25.20.100.6444
INFO: GL: VAO extension detected, VAO functions loaded successfully
INFO: GL: NPOT textures extension detected, full NPOT textures supported
INFO: GL: DXT compressed textures supported
INFO: GL: ETC2/EAC compressed textures supported
INFO: GL: ASTC compressed textures supported
INFO: PLATFORM: DESKTOP (GLFW): Initialized successfully
INFO: TEXTURE: [ID 1] Texture loaded successfully (1x1 | R8G8B8A8 | 1 mipmaps)
INFO: TEXTURE: [ID 1] Default texture loaded successfully
INFO: SHADER: [ID 1] Vertex shader compiled successfully
INFO: SHADER: [ID 2] Fragment shader compiled successfully
INFO: SHADER: [ID 3] Program shader loaded successfully
INFO: SHADER: [ID 3] Default shader loaded successfully
INFO: RLGL: Render batch vertex buffers loaded successfully in RAM (CPU)
INFO: RLGL: Render batch vertex buffers loaded successfully in VRAM (GPU)
INFO: RLGL: Default OpenGL state initialized successfully
INFO: TEXTURE: [ID 2] Texture loaded successfully (128x128 | GRAY_ALPHA | 1 mipmaps)
INFO: FONT: Default font loaded successfully (224 glyphs)
INFO: FILEIO: [nature_tileset/OpenWorldMap24x24.png] File loaded successfully
INFO: IMAGE: Data loaded successfully (768x768 | R8G8B8A8 | 1 mipmaps)
INFO: TEXTURE: [ID 3] Texture loaded successfully (768x768 | R8G8B8A8 | 1 mipmaps)
INFO: FILEIO: [characters/knight_idle_spritesheet.png] File loaded successfully
INFO: IMAGE: Data loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps)
INFO: TEXTURE: [ID 4] Texture loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps)
INFO: FILEIO: [characters/knight_idle_spritesheet.png] File loaded successfully
INFO: IMAGE: Data loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps)
INFO: TEXTURE: [ID 5] Texture loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps)
INFO: FILEIO: [characters/knight_run_spritesheet.png] File loaded successfully
INFO: IMAGE: Data loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps)
INFO: TEXTURE: [ID 6] Texture loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps)
INFO: FILEIO: [characters/weapon_sword.png] File loaded successfully
INFO: IMAGE: Data loaded successfully (16x16 | R8G8B8A8 | 1 mipmaps)
INFO: TEXTURE: [ID 7] Texture loaded successfully (16x16 | R8G8B8A8 | 1 mipmaps)
INFO: FILEIO: [characters/goblin_run_spritesheet-export.png] File loaded successfully
INFO: IMAGE: Data loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps)
INFO: TEXTURE: [ID 8] Texture loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps)
INFO: FILEIO: [characters/goblin_idle_spritesheet-export.png] File loaded successfully
INFO: IMAGE: Data loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps)
INFO: TEXTURE: [ID 9] Texture loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps)
INFO: FILEIO: [characters/knight_idle_spritesheet.png] File loaded successfully
INFO: IMAGE: Data loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps)
INFO: TEXTURE: [ID 10] Texture loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps)
INFO: FILEIO: [characters/knight_idle_spritesheet.png] File loaded successfully
INFO: IMAGE: Data loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps)
INFO: TEXTURE: [ID 11] Texture loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps)
INFO: FILEIO: [characters/knight_run_spritesheet.png] File loaded successfully
INFO: IMAGE: Data loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps)
INFO: TEXTURE: [ID 12] Texture loaded successfully (96x16 | R8G8B8A8 | 1 mipmaps)
INFO: FILEIO: [nature_tileset/Rock.png] File loaded successfully
INFO: IMAGE: Data loaded successfully (22x21 | R8G8B8A8 | 1 mipmaps)
INFO: TEXTURE: [ID 13] Texture loaded successfully (22x21 | R8G8B8A8 | 1 mipmaps)
INFO: FILEIO: [nature_tileset/Log.png] File loaded successfully
INFO: IMAGE: Data loaded successfully (27x16 | R8G8B8A8 | 1 mipmaps)
INFO: TEXTURE: [ID 14] Texture loaded successfully (27x16 | R8G8B8A8 | 1 mipmaps)
INFO: FILEIO: [nature_tileset/Sign.png] File loaded successfully
INFO: IMAGE: Data loaded successfully (22x25 | R8G8B8A8 | 1 mipmaps)
INFO: TEXTURE: [ID 15] Texture loaded successfully (22x25 | R8G8B8A8 | 1 mipmaps)
INFO: TIMER: Target time per frame: 16.667 milliseconds

This is the MAKEFILE:

#**************************************************************************************************
#
#   raylib makefile for Desktop platforms, Raspberry Pi, Android and HTML5
#
#   Copyright (c) 2013-2019 Ramon Santamaria (@raysan5)
#
#   This software is provided "as-is", without any express or implied warranty. In no event
#   will the authors be held liable for any damages arising from the use of this software.
#
#   Permission is granted to anyone to use this software for any purpose, including commercial
#   applications, and to alter it and redistribute it freely, subject to the following restrictions:
#
#     1. The origin of this software must not be misrepresented; you must not claim that you
#     wrote the original software. If you use this software in a product, an acknowledgment
#     in the product documentation would be appreciated but is not required.
#
#     2. Altered source versions must be plainly marked as such, and must not be misrepresented
#     as being the original software.
#
#     3. This notice may not be removed or altered from any source distribution.
#
#**************************************************************************************************

.PHONY: all clean

# Define required raylib variables
PROJECT_NAME       ?= game
RAYLIB_VERSION     ?= 3.0.0
RAYLIB_API_VERSION ?= 300
RAYLIB_PATH        ?= ..\..

# Define compiler path on Windows
COMPILER_PATH      ?= C:/raylib/w64devkit/bin

# Define default options
# One of PLATFORM_DESKTOP, PLATFORM_RPI, PLATFORM_ANDROID, PLATFORM_WEB
PLATFORM           ?= PLATFORM_DESKTOP

# Locations of your newly installed library and associated headers. See ../src/Makefile
# On Linux, if you have installed raylib but cannot compile the examples, check that
# the *_INSTALL_PATH values here are the same as those in src/Makefile or point to known locations.
# To enable system-wide compile-time and runtime linking to libraylib.so, run ../src/$ sudo make install RAYLIB_LIBTYPE_SHARED.
# To enable compile-time linking to a special version of libraylib.so, change these variables here.
# To enable runtime linking to a special version of libraylib.so, see EXAMPLE_RUNTIME_PATH below.
# If there is a libraylib in both EXAMPLE_RUNTIME_PATH and RAYLIB_INSTALL_PATH, at runtime,
# the library at EXAMPLE_RUNTIME_PATH, if present, will take precedence over the one at RAYLIB_INSTALL_PATH.
# RAYLIB_INSTALL_PATH should be the desired full path to libraylib. No relative paths.
DESTDIR ?= /usr/local
RAYLIB_INSTALL_PATH ?= $(DESTDIR)/lib
# RAYLIB_H_INSTALL_PATH locates the installed raylib header and associated source files.
RAYLIB_H_INSTALL_PATH ?= $(DESTDIR)/include

# Library type used for raylib: STATIC (.a) or SHARED (.so/.dll)
RAYLIB_LIBTYPE        ?= STATIC

# Build mode for project: DEBUG or RELEASE
#BUILD_MODE            ?= RELEASE
BUILD_MODE             ?= DEBUG

# Use external GLFW library instead of rglfw module
# TODO: Review usage on Linux. Target version of choice. Switch on -lglfw or -lglfw3
USE_EXTERNAL_GLFW     ?= FALSE

# Use Wayland display server protocol on Linux desktop
# by default it uses X11 windowing system
USE_WAYLAND_DISPLAY   ?= FALSE

# Determine PLATFORM_OS in case PLATFORM_DESKTOP selected
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
    # No uname.exe on MinGW!, but OS=Windows_NT on Windows!
    # ifeq ($(UNAME),Msys) -> Windows
    ifeq ($(OS),Windows_NT)
        PLATFORM_OS=WINDOWS
        export PATH := $(COMPILER_PATH):$(PATH)
    else
        UNAMEOS=$(shell uname)
        ifeq ($(UNAMEOS),Linux)
            PLATFORM_OS=LINUX
        endif
        ifeq ($(UNAMEOS),FreeBSD)
            PLATFORM_OS=BSD
        endif
        ifeq ($(UNAMEOS),OpenBSD)
            PLATFORM_OS=BSD
        endif
        ifeq ($(UNAMEOS),NetBSD)
            PLATFORM_OS=BSD
        endif
        ifeq ($(UNAMEOS),DragonFly)
            PLATFORM_OS=BSD
        endif
        ifeq ($(UNAMEOS),Darwin)
            PLATFORM_OS=OSX
        endif
    endif
endif
ifeq ($(PLATFORM),PLATFORM_RPI)
    UNAMEOS=$(shell uname)
    ifeq ($(UNAMEOS),Linux)
        PLATFORM_OS=LINUX
    endif
endif

# RAYLIB_PATH adjustment for different platforms.
# If using GNU make, we can get the full path to the top of the tree. Windows? BSD?
# Required for ldconfig or other tools that do not perform path expansion.
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
    ifeq ($(PLATFORM_OS),LINUX)
        RAYLIB_PREFIX ?= ..
        RAYLIB_PATH    = $(realpath $(RAYLIB_PREFIX))
    endif
endif
# Default path for raylib on Raspberry Pi, if installed in different path, update it!
# This is not currently used by src/Makefile. Not sure of its origin or usage. Refer to wiki.
# TODO: update install: target in src/Makefile for RPI, consider relation to LINUX.
ifeq ($(PLATFORM),PLATFORM_RPI)
    RAYLIB_PATH       ?= /home/pi/raylib
endif

ifeq ($(PLATFORM),PLATFORM_WEB)
    # Emscripten required variables
    EMSDK_PATH          ?= C:/emsdk
    EMSCRIPTEN_VERSION  ?= 1.38.31
    CLANG_VERSION       = e$(EMSCRIPTEN_VERSION)_64bit
    PYTHON_VERSION      = 2.7.13.1_64bit\python-2.7.13.amd64
    NODE_VERSION        = 8.9.1_64bit
    export PATH         = $(EMSDK_PATH);$(EMSDK_PATH)\clang\$(CLANG_VERSION);$(EMSDK_PATH)\node\$(NODE_VERSION)\bin;$(EMSDK_PATH)\python\$(PYTHON_VERSION);$(EMSDK_PATH)\emscripten\$(EMSCRIPTEN_VERSION);C:\raylib\MinGW\bin:$$(PATH)
    EMSCRIPTEN          = $(EMSDK_PATH)\emscripten\$(EMSCRIPTEN_VERSION)
endif

# Define raylib release directory for compiled library.
# RAYLIB_RELEASE_PATH points to provided binaries or your freshly built version
RAYLIB_RELEASE_PATH 	?= $(RAYLIB_PATH)/src

# EXAMPLE_RUNTIME_PATH embeds a custom runtime location of libraylib.so or other desired libraries
# into each example binary compiled with RAYLIB_LIBTYPE=SHARED. It defaults to RAYLIB_RELEASE_PATH
# so that these examples link at runtime with your version of libraylib.so in ../release/libs/linux
# without formal installation from ../src/Makefile. It aids portability and is useful if you have
# multiple versions of raylib, have raylib installed to a non-standard location, or want to
# bundle libraylib.so with your game. Change it to your liking.
# NOTE: If, at runtime, there is a libraylib.so at both EXAMPLE_RUNTIME_PATH and RAYLIB_INSTALL_PATH,
# The library at EXAMPLE_RUNTIME_PATH, if present, will take precedence over RAYLIB_INSTALL_PATH,
# Implemented for LINUX below with CFLAGS += -Wl,-rpath,$(EXAMPLE_RUNTIME_PATH)
# To see the result, run readelf -d core/core_basic_window; looking at the RPATH or RUNPATH attribute.
# To see which libraries a built example is linking to, ldd core/core_basic_window;
# Look for libraylib.so.1 => $(RAYLIB_INSTALL_PATH)/libraylib.so.1 or similar listing.
EXAMPLE_RUNTIME_PATH   ?= $(RAYLIB_RELEASE_PATH)

# Define default C compiler: gcc
# NOTE: define g++ compiler if using C++
CC = g++

ifeq ($(PLATFORM),PLATFORM_DESKTOP)
    ifeq ($(PLATFORM_OS),OSX)
        # OSX default compiler
        CC = clang++
    endif
    ifeq ($(PLATFORM_OS),BSD)
        # FreeBSD, OpenBSD, NetBSD, DragonFly default compiler
        CC = clang
    endif
endif
ifeq ($(PLATFORM),PLATFORM_RPI)
    ifeq ($(USE_RPI_CROSS_COMPILER),TRUE)
        # Define RPI cross-compiler
        #CC = armv6j-hardfloat-linux-gnueabi-gcc
        CC = $(RPI_TOOLCHAIN)/bin/arm-linux-gnueabihf-gcc
    endif
endif
ifeq ($(PLATFORM),PLATFORM_WEB)
    # HTML5 emscripten compiler
    # WARNING: To compile to HTML5, code must be redesigned 
    # to use emscripten.h and emscripten_set_main_loop()
    CC = emcc
endif

# Define default make program: Mingw32-make
MAKE = mingw32-make


ifeq ($(PLATFORM),PLATFORM_DESKTOP)
    ifeq ($(PLATFORM_OS),LINUX)
        MAKE = make
    endif
    ifeq ($(PLATFORM_OS),OSX)
        MAKE = make
    endif
endif

# Define compiler flags:
#  -O0                  defines optimization level (no optimization, better for debugging)
#  -O1                  defines optimization level
#  -g                   include debug information on compilation
#  -s                   strip unnecessary data from build -> do not use in debug builds
#  -Wall                turns on most, but not all, compiler warnings
#  -std=c99             defines C language mode (standard C from 1999 revision)
#  -std=gnu99           defines C language mode (GNU C from 1999 revision)
#  -Wno-missing-braces  ignore invalid warning (GCC bug 53119)
#  -D_DEFAULT_SOURCE    use with -std=c99 on Linux and PLATFORM_WEB, required for timespec
CFLAGS += -Wall -std=c++14 -D_DEFAULT_SOURCE -Wno-missing-braces 
ifeq ($(BUILD_MODE),DEBUG)
    CFLAGS += -g -O0 

else
    CFLAGS += -s -O1 

endif

# Additional flags for compiler (if desired)
#CFLAGS += -Wextra -Wmissing-prototypes -Wstrict-prototypes
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
    ifeq ($(PLATFORM_OS),WINDOWS)
        # resource file contains windows executable icon and properties
        # -Wl,--subsystem,windows hides the console window
        CFLAGS += $(RAYLIB_PATH)/src/raylib.rc.data
    endif
    ifeq ($(PLATFORM_OS),LINUX)
        ifeq ($(RAYLIB_LIBTYPE),STATIC)
            CFLAGS += -D_DEFAULT_SOURCE
        endif
        ifeq ($(RAYLIB_LIBTYPE),SHARED)
            # Explicitly enable runtime link to libraylib.so
            CFLAGS += -Wl,-rpath,$(EXAMPLE_RUNTIME_PATH)
        endif
    endif
endif
ifeq ($(PLATFORM),PLATFORM_RPI)
    CFLAGS += -std=gnu99
endif
ifeq ($(PLATFORM),PLATFORM_WEB)
    # -Os                        # size optimization
    # -O2                        # optimization level 2, if used, also set --memory-init-file 0
    # -s USE_GLFW=3              # Use glfw3 library (context/input management)
    # -s ALLOW_MEMORY_GROWTH=1   # to allow memory resizing -> WARNING: Audio buffers could FAIL!
    # -s TOTAL_MEMORY=16777216   # to specify heap memory size (default = 16MB)
    # -s USE_PTHREADS=1          # multithreading support
    # -s WASM=0                  # disable Web Assembly, emitted by default
    # -s EMTERPRETIFY=1          # enable emscripten code interpreter (very slow)
    # -s EMTERPRETIFY_ASYNC=1    # support synchronous loops by emterpreter
    # -s FORCE_FILESYSTEM=1      # force filesystem to load/save files data
    # -s ASSERTIONS=1            # enable runtime checks for common memory allocation errors (-O1 and above turn it off)
    # --profiling                # include information for code profiling
    # --memory-init-file 0       # to avoid an external memory initialization code file (.mem)
    # --preload-file resources   # specify a resources folder for data compilation
    CFLAGS += -Os -s USE_GLFW=3 -s TOTAL_MEMORY=16777216 --preload-file resources
    ifeq ($(BUILD_MODE), DEBUG)
        CFLAGS += -s ASSERTIONS=1 --profiling
    endif

    # Define a custom shell .html and output extension
    CFLAGS += --shell-file $(RAYLIB_PATH)/src/shell.html
    EXT = .html
endif

# Define include paths for required headers
# NOTE: Several external required libraries (stb and others)
INCLUDE_PATHS = -I. -I$(RAYLIB_PATH)/src -I$(RAYLIB_PATH)/src/external

# Define additional directories containing required header files
ifeq ($(PLATFORM),PLATFORM_RPI)
    # RPI required libraries
    INCLUDE_PATHS += -I/opt/vc/include
    INCLUDE_PATHS += -I/opt/vc/include/interface/vmcs_host/linux
    INCLUDE_PATHS += -I/opt/vc/include/interface/vcos/pthreads
endif
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
    ifeq ($(PLATFORM_OS),BSD)
        # Consider -L$(RAYLIB_H_INSTALL_PATH)
        INCLUDE_PATHS += -I/usr/local/include
    endif
    ifeq ($(PLATFORM_OS),LINUX)
        # Reset everything.
        # Precedence: immediately local, installed version, raysan5 provided libs -I$(RAYLIB_H_INSTALL_PATH) -I$(RAYLIB_PATH)/release/include
        INCLUDE_PATHS = -I$(RAYLIB_H_INSTALL_PATH) -isystem. -isystem$(RAYLIB_PATH)/src -isystem$(RAYLIB_PATH)/release/include -isystem$(RAYLIB_PATH)/src/external
    endif
endif

# Define library paths containing required libs.
LDFLAGS = -L. -L$(RAYLIB_RELEASE_PATH) -L$(RAYLIB_PATH)/src

ifeq ($(PLATFORM),PLATFORM_DESKTOP)
    ifeq ($(PLATFORM_OS),BSD)
        # Consider -L$(RAYLIB_INSTALL_PATH)
        LDFLAGS += -L. -Lsrc -L/usr/local/lib
    endif
    ifeq ($(PLATFORM_OS),LINUX)
        # Reset everything.
        # Precedence: immediately local, installed version, raysan5 provided libs
        LDFLAGS = -L. -L$(RAYLIB_INSTALL_PATH) -L$(RAYLIB_RELEASE_PATH)
    endif
endif

ifeq ($(PLATFORM),PLATFORM_RPI)
    LDFLAGS += -L/opt/vc/lib
endif

# Define any libraries required on linking
# if you want to link libraries (libname.so or libname.a), use the -lname
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
    ifeq ($(PLATFORM_OS),WINDOWS)
        # Libraries for Windows desktop compilation
        # NOTE: WinMM library required to set high-res timer resolution
        LDLIBS = -lraylib -lopengl32 -lgdi32 -lwinmm
        # Required for physac examples
        #LDLIBS += -static -lpthread
    endif
    ifeq ($(PLATFORM_OS),LINUX)
        # Libraries for Debian GNU/Linux desktop compiling
        # NOTE: Required packages: libegl1-mesa-dev
        LDLIBS = -lraylib -lGL -lm -lpthread -ldl -lrt
        
        # On X11 requires also below libraries
        LDLIBS += -lX11
        # NOTE: It seems additional libraries are not required any more, latest GLFW just dlopen them
        #LDLIBS += -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor
        
        # On Wayland windowing system, additional libraries requires
        ifeq ($(USE_WAYLAND_DISPLAY),TRUE)
            LDLIBS += -lwayland-client -lwayland-cursor -lwayland-egl -lxkbcommon
        endif
        # Explicit link to libc
        ifeq ($(RAYLIB_LIBTYPE),SHARED)
            LDLIBS += -lc
        endif
    endif
    ifeq ($(PLATFORM_OS),OSX)
        # Libraries for OSX 10.9 desktop compiling
        # NOTE: Required packages: libopenal-dev libegl1-mesa-dev
        LDLIBS = -lraylib -framework OpenGL -framework OpenAL -framework Cocoa
    endif
    ifeq ($(PLATFORM_OS),BSD)
        # Libraries for FreeBSD, OpenBSD, NetBSD, DragonFly desktop compiling
        # NOTE: Required packages: mesa-libs
        LDLIBS = -lraylib -lGL -lpthread -lm

        # On XWindow requires also below libraries
        LDLIBS += -lX11 -lXrandr -lXinerama -lXi -lXxf86vm -lXcursor
    endif
    ifeq ($(USE_EXTERNAL_GLFW),TRUE)
        # NOTE: It could require additional packages installed: libglfw3-dev
        LDLIBS += -lglfw
    endif
endif
ifeq ($(PLATFORM),PLATFORM_RPI)
    # Libraries for Raspberry Pi compiling
    # NOTE: Required packages: libasound2-dev (ALSA)
    LDLIBS = -lraylib -lbrcmGLESv2 -lbrcmEGL -lpthread -lrt -lm -lbcm_host -ldl
endif
ifeq ($(PLATFORM),PLATFORM_WEB)
    # Libraries for web (HTML5) compiling
    LDLIBS = $(RAYLIB_RELEASE_PATH)/libraylib.bc
endif

# Define a recursive wildcard function
rwildcard=$(foreach d,$(wildcard $1*),$(call rwildcard,$d/,$2) $(filter $(subst *,%,$2),$d))

# Define all source files required
SRC_DIR = src
OBJ_DIR = obj

# Define all object files from source files
SRC = $(call rwildcard, *.c, *.h)
#OBJS = $(SRC:$(SRC_DIR)/%.c=$(OBJ_DIR)/%.o)
OBJS ?= main.c

# For Android platform we call a custom Makefile.Android
ifeq ($(PLATFORM),PLATFORM_ANDROID)
    MAKEFILE_PARAMS = -f Makefile.Android 
    export PROJECT_NAME
    export SRC_DIR
else
    MAKEFILE_PARAMS = $(PROJECT_NAME)
endif

# Default target entry
# NOTE: We call this Makefile target or Makefile.Android target
all:
	$(MAKE) $(MAKEFILE_PARAMS)

# Project target defined by PROJECT_NAME
$(PROJECT_NAME): $(OBJS)
	$(CC) -o $(PROJECT_NAME)$(EXT) $(OBJS) $(CFLAGS) $(INCLUDE_PATHS) $(LDFLAGS) $(LDLIBS) -D$(PLATFORM)

# Compile source files
# NOTE: This pattern will compile every module defined on $(OBJS)
#%.o: %.c
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c
	$(CC) -c $< -o $@ $(CFLAGS) $(INCLUDE_PATHS) -D$(PLATFORM)

# Clean everything
clean:
ifeq ($(PLATFORM),PLATFORM_DESKTOP)
    ifeq ($(PLATFORM_OS),WINDOWS)
		del *.o *.exe /s
    endif
    ifeq ($(PLATFORM_OS),LINUX)
	find -type f -executable | xargs file -i | grep -E 'x-object|x-archive|x-sharedlib|x-executable' | rev | cut -d ':' -f 2- | rev | xargs rm -fv
    endif
    ifeq ($(PLATFORM_OS),OSX)
		find . -type f -perm +ugo+x -delete
		rm -f *.o
    endif
endif
ifeq ($(PLATFORM),PLATFORM_RPI)
	find . -type f -executable -delete
	rm -fv *.o
endif
ifeq ($(PLATFORM),PLATFORM_WEB)
	del *.o *.html *.js
endif
	@echo Cleaning done


Something is not working correctly as unless main.cpp is changed, no other changes in the code appear in the final main.exe.

Also, when I call make from the terminal it says this:

mingw32-make game
make[1]: Entering directory 'C:/Users/jason/Documents/c++course/Clashy Clash'
make[1]: *** No rule to make target 'main.c', needed by 'game'.  Stop.
make[1]: Leaving directory 'C:/Users/jason/Documents/c++course/Clashy Clash'
make: *** [Makefile:378: all] Error 2

You don’t want to build your project by running any commands in the terminal. I suspect what’s happening is that when you’re pressing F5 VS Code doesn’t quite know what to do. So, I suggest you give this a try first before pressing F5 (a default action should be made after doing this)

First, go to Terminal > Run Task

image

Then, select “build debug”, this is a task we’ve configured using tasks.json in the .vscode folder
image

This will still use the makefile, but it will also use the commands and give the information needed to compile the project properly.

Tuomo_T

Thank you so much for your speedy responses. It was getting quite frustrating BUT I think you have smashed it. Tried a few compiles after ‘Terminal->Run Task’ and all seems to compile as expected. Any changed made in i.e character.cpp is shown in the built app and, thus far, without any changes to main.cpp!

I will try the last couple of videos of the course over the next few days!! Also, it seems watching vars in debug mode also seems to work!

Thank you for your patience!

You’re welcome! Having behaviour like that is definitely frustrating so I wanted to get to answer with you so you can continue to have fun on your learning journey!

Tuomo_T

Do you do any further courses anywhere (around c++ with raylib or otyer libraries)? I although I have not finished yet, it would be great to understand how best to use c++ of classes with virtual functions. I kinda get the principles but not the practice. Also, how to use tiled maps. Again I understand the principles but would love to be able to use tiiles and understand tile collisions etc?

All of our other C++ courses use UnrealEngine.

This topic was automatically closed 20 days after the last reply. New replies are no longer allowed.

Privacy & Terms