#include #include #include #include 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; }