Nimbin[12]?SDL & Graphics / sdl_runtime_compiler / test_dlopen/main.cpp

sdl_runtime_compiler git · main

SDL3 game for running and compiling code at runtime

sdl3 c++ compiler dlopen cmake · first commit 2026-04-19 · last commit 2026-07-03 (3 months ago) · synced 3 days ago · upstream: git.ide3.de/hsnr/sdl-runtime-compiler

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.gz
test_dlopen/main.cpp 1.7 KB · 88 lines 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;
}