sdl_runtime_compiler git · main
SDL3 game for running and compiling code at runtime
C++ 72.3% C 26.2%git clone https://git.christianimmanuel.de/sdl-graphics/sdl_runtime_compiler.gitwget https://git.christianimmanuel.de/sdl-graphics/sdl_runtime_compiler/archive/sdl_runtime_compiler.tar.gztest_dlopen/main.cpp raw
#include <SDL3/SDL.h>
#include <dlfcn.h>
#include <iostream>
#include <unistd.h>
struct Color {
float r, g, b, a;
};
typedef Color (*GetColorFunc)();
void* load_lib(void*& handle, GetColorFunc& func)
{
if (handle)
dlclose(handle);
handle = dlopen("./libconfig.so", RTLD_NOW);
if (!handle) {
std::cerr << "dlopen failed: " << dlerror() << "\n";
func = nullptr;
return nullptr;
}
func = (GetColorFunc)dlsym(handle, "get_background_color");
if (!func) {
std::cerr << "dlsym failed\n";
}
return handle;
}
int main()
{
SDL_Init(SDL_INIT_VIDEO);
SDL_Window* window = SDL_CreateWindow(
"SDL3 hot reload",
800, 600,
0
);
SDL_Renderer* renderer = SDL_CreateRenderer(window, nullptr);
void* lib = nullptr;
GetColorFunc get_color = nullptr;
load_lib(lib, get_color);
bool running = true;
while (running)
{
SDL_Event e;
while (SDL_PollEvent(&e))
{
if (e.type == SDL_EVENT_QUIT)
running = false;
}
// reload every loop (simple hot reload approach)
load_lib(lib, get_color);
Color c = {0,0,0,1};
if (get_color)
c = get_color();
SDL_SetRenderDrawColor(renderer,
(Uint8)(c.r * 255),
(Uint8)(c.g * 255),
(Uint8)(c.b * 255),
(Uint8)(c.a * 255)
);
SDL_RenderClear(renderer);
SDL_RenderPresent(renderer);
SDL_Delay(16);
}
if (lib)
dlclose(lib);
SDL_DestroyRenderer(renderer);
SDL_DestroyWindow(window);
SDL_Quit();
return 0;
}