Integrating WebGPU-Native, SDL3, and SDL3_image on Windows & Ubuntu Интеграция WebGPU-Native, SDL3 и SDL3_image под Windows и Ubuntu

A step-by-step guide to setting up and configuring WebGPU-Native with SDL3 and SDL3_image in your CMake projects on Windows and Ubuntu. Пошаговое руководство по настройке и конфигурированию WebGPU-Native с SDL3 и SDL3_image в проекты CMake под Windows и Ubuntu.

Step 1: Create Project Directory Шаг 1: Создание директории проекта

Create a workspace folder and a new directory for your WebGPU-Native, SDL3, and SDL3_image starter project: Создайте рабочую папку для проектов и новую директорию для вашего стартового проекта WebGPU-Native, SDL3 и SDL3_image:

Windows (Command Prompt / PowerShell)

mkdir C:\projects\webgpu-sdl3-image-starter
cd C:\projects\webgpu-sdl3-image-starter

Ubuntu (Terminal)

mkdir -p ~/projects/webgpu-sdl3-image-starter
cd ~/projects/webgpu-sdl3-image-starter

Step 2: Create Source Files (main.cpp & CMakeLists.txt) Шаг 2: Создание исходных файлов (main.cpp и CMakeLists.txt)

Create a src directory and add main.cpp along with CMakeLists.txt in the project root: Создайте директорию src и добавьте main.cpp вместе с CMakeLists.txt в корень проекта:

Windows (Terminal / Notepad)

mkdir src
notepad src\main.cpp
notepad CMakeLists.txt

Ubuntu (Terminal / Nano)

mkdir -p src
nano src/main.cpp
nano CMakeLists.txt
Quick Nano Commands (Ubuntu):Быстрые команды Nano (Ubuntu): Paste code with Right Mouse Button (RMB) → Press Ctrl + O and Enter to save → Press Ctrl + X to exit. Вставьте код правой кнопкой мыши (ПКМ) → Нажмите Ctrl + O и Enter для сохранения → Нажмите Ctrl + X для выхода.

1. File Contents for src/main.cpp 1. Содержимое файла src/main.cpp

#include <SDL3/SDL.h>
#include <SDL3_image/SDL_image.h>
#include <webgpu/webgpu.h>
#include <iostream>

int main(int argc, char* argv[]) {
    if (!SDL_Init(SDL_INIT_VIDEO)) {
        std::cerr << "Failed to initialize SDL: " << SDL_GetError() << std::endl;
        return -1;
    }

    SDL_Window* window = SDL_CreateWindow("WebGPU Native + SDL3 + SDL3_image Test", 800, 600, SDL_WINDOW_RESIZABLE);
    if (!window) {
        std::cerr << "Failed to create window: " << SDL_GetError() << std::endl;
        SDL_Quit();
        return -1;
    }

    WGPUInstanceDescriptor instanceDesc = {};
    instanceDesc.nextInChain = nullptr;
    WGPUInstance instance = wgpuCreateInstance(&instanceDesc);

    if (!instance) {
        std::cerr << "Failed to create WebGPU Instance." << std::endl;
        SDL_DestroyWindow(window);
        SDL_Quit();
        return -1;
    }

    SDL_Surface* surface = IMG_Load("test.png");
    if (!surface) {
        std::cout << "SDL3_image warning: Could not load 'test.png' (" << SDL_GetError() 
                  << "), but SDL3_image library is linked and initialized properly!" << std::endl;
    } else {
        std::cout << "Successfully loaded image! Dimensions: " << surface->w << "x" << surface->h << std::endl;
        SDL_DestroySurface(surface);
    }

    std::cout << "SDL3, SDL3_image, and WebGPU Native initialized successfully!" << std::endl;

    bool running = true;
    SDL_Event event;
    while (running) {
        while (SDL_PollEvent(&event)) {
            if (event.type == SDL_EVENT_QUIT) {
                running = false;
            }
        }
    }

    wgpuInstanceRelease(instance);
    SDL_DestroyWindow(window);
    SDL_Quit();

    return 0;
}

2. File Contents for CMakeLists.txt 2. Содержимое файла CMakeLists.txt

cmake_minimum_required(VERSION 3.21)
project(webgpu-sdl3-image-starter CXX)

set(CMAKE_BUILD_TYPE "Debug")
set(CMAKE_CXX_STANDARD 20)
set(CMAKE_CXX_STANDARD_REQUIRED ON)

set(PROJECT_SOURCES
    src/main.cpp
)

add_executable(app)
target_sources(app PRIVATE ${PROJECT_SOURCES})

if(WIN32)
    set(WEBP_PATH "C:/libs/webp-1.6.0-mingw")

    # Core WebP library
    add_library(webp STATIC IMPORTED)
    set_target_properties(webp PROPERTIES
        IMPORTED_LOCATION "${WEBP_PATH}/lib/libwebp.a"
        INTERFACE_INCLUDE_DIRECTORIES "${WEBP_PATH}/include"
    )

    # WebP Demuxing
    add_library(webpdemux STATIC IMPORTED)
    set_target_properties(webpdemux PROPERTIES
        IMPORTED_LOCATION "${WEBP_PATH}/lib/libwebpdemux.a"
        INTERFACE_INCLUDE_DIRECTORIES "${WEBP_PATH}/include"
    )

    # WebP Muxing
    add_library(webpmux STATIC IMPORTED)
    set_target_properties(webpmux PROPERTIES
        IMPORTED_LOCATION "${WEBP_PATH}/lib/libwebpmux.a"
        INTERFACE_INCLUDE_DIRECTORIES "${WEBP_PATH}/include"
    )

    # SharpYUV helper library
    add_library(sharpyuv STATIC IMPORTED)
    set_target_properties(sharpyuv PROPERTIES
        IMPORTED_LOCATION "${WEBP_PATH}/lib/libsharpyuv.a"
    )

    # SDL3 Image Static
    add_library(SDL3_image_Static STATIC IMPORTED)
    set_target_properties(SDL3_image_Static PROPERTIES
        IMPORTED_LOCATION "C:/libs/sdl3-image-3.4.6-mingw/lib/libSDL3_image.a"
        INTERFACE_INCLUDE_DIRECTORIES "C:/libs/sdl3-image-3.4.6-mingw/include"
        INTERFACE_LINK_LIBRARIES "webpmux;webpdemux;webp;sharpyuv"
    )

    # SDL3 Core Static
    add_library(SDL3_Static STATIC IMPORTED)
    set_target_properties(SDL3_Static PROPERTIES
        IMPORTED_LOCATION "C:/libs/sdl3-3.4.16-mingw/lib/libSDL3.a"
        INTERFACE_INCLUDE_DIRECTORIES "C:/libs/sdl3-3.4.16-mingw/include"
        INTERFACE_LINK_LIBRARIES "winmm;imm32;version;setupapi;dinput8"
    )

    # WGPU Static
    add_library(wgpu_native STATIC IMPORTED)
    set_target_properties(wgpu_native PROPERTIES
        IMPORTED_LOCATION "C:/libs/wgpu-29.0.1.1-mingw/lib/libwgpu_native.a"
        INTERFACE_INCLUDE_DIRECTORIES "C:/libs/wgpu-29.0.1.1-mingw/include"
        INTERFACE_LINK_LIBRARIES "ws2_32;userenv;ntdll;bcrypt;d3d12;dxgi"
    )

    target_link_libraries(app PRIVATE
        SDL3_image_Static
        SDL3_Static
        wgpu_native
    )

    target_compile_options(app PRIVATE -Os)
    target_link_options(app PRIVATE -static -s -static-libgcc -static-libstdc++)

    if (CMAKE_BUILD_TYPE STREQUAL "Debug")
        target_link_options(app PRIVATE -mconsole)
    else()
        target_link_options(app PRIVATE -mwindows)
    endif()

else()
    # Ubuntu / Linux Configuration
    set(WEBP_PATH "$ENV{HOME}/libs/webp-1.6.0-ubuntu")

    add_library(webp STATIC IMPORTED)
    set_target_properties(webp PROPERTIES
        IMPORTED_LOCATION "${WEBP_PATH}/lib/libwebp.a"
        INTERFACE_INCLUDE_DIRECTORIES "${WEBP_PATH}/include"
    )

    add_library(webpdemux STATIC IMPORTED)
    set_target_properties(webpdemux PROPERTIES
        IMPORTED_LOCATION "${WEBP_PATH}/lib/libwebpdemux.a"
        INTERFACE_INCLUDE_DIRECTORIES "${WEBP_PATH}/include"
    )

    add_library(webpmux STATIC IMPORTED)
    set_target_properties(webpmux PROPERTIES
        IMPORTED_LOCATION "${WEBP_PATH}/lib/libwebpmux.a"
        INTERFACE_INCLUDE_DIRECTORIES "${WEBP_PATH}/include"
    )

    add_library(sharpyuv STATIC IMPORTED)
    set_target_properties(sharpyuv PROPERTIES
        IMPORTED_LOCATION "${WEBP_PATH}/lib/libsharpyuv.a"
    )

    add_library(SDL3_Static STATIC IMPORTED)
    set_target_properties(SDL3_Static PROPERTIES
        IMPORTED_LOCATION "$ENV{HOME}/libs/sdl3-3.4.16-ubuntu/lib/libSDL3.a"
        INTERFACE_INCLUDE_DIRECTORIES "$ENV{HOME}/libs/sdl3-3.4.16-ubuntu/include"
    )

    add_library(SDL3_image_Static STATIC IMPORTED)
    set_target_properties(SDL3_image_Static PROPERTIES
        IMPORTED_LOCATION "$ENV{HOME}/libs/sdl3-image-3.4.6-ubuntu/lib/libSDL3_image.a"
        INTERFACE_INCLUDE_DIRECTORIES "$ENV{HOME}/libs/sdl3-image-3.4.6-ubuntu/include"
        INTERFACE_LINK_LIBRARIES "webpmux;webpdemux;webp;sharpyuv"
    )

    add_library(wgpu_native STATIC IMPORTED)
    set_target_properties(wgpu_native PROPERTIES
        IMPORTED_LOCATION "$ENV{HOME}/libs/wgpu-native-29.0.1.1-ubuntu/lib/libwgpu_native.a"
        INTERFACE_INCLUDE_DIRECTORIES "$ENV{HOME}/libs/wgpu-native-29.0.1.1-ubuntu/include"
    )

    target_link_libraries(app PRIVATE
        SDL3_image_Static
        SDL3_Static
        wgpu_native
        pthread
        dl
    )
endif()

Step 3: Create Build & Execution Scripts Шаг 3: Создание скриптов сборки и запуска

Windows (MinGW / Batch Scripts)

config-exe.bat

cmake -G Ninja -S . -B dist/win

build-exe.bat

cmake --build dist/win

run-exe.bat

@echo off
.\dist\win\app.exe

Run the scripts sequentially in Command Prompt or PowerShell: Последовательно запустите скрипты в командной строке или PowerShell:

config-exe.bat
build-exe.bat
run-exe.bat

Ubuntu (Bash Scripts)

config-bin.sh

#!/usr/bin/env bash
set -e
cmake -G Ninja -S . -B dist/linux

build-bin.sh

#!/usr/bin/env bash
set -e
cmake --build dist/linux

run-bin.sh

#!/usr/bin/env bash
set -e
./dist/linux/app

Grant execute permissions on Ubuntu before running: Предоставьте права на выполнение в Ubuntu перед запуском:

chmod +x config-bin.sh build-bin.sh run-bin.sh
./config-bin.sh
./build-bin.sh
./run-bin.sh

Step 4: Expected Output Шаг 4: Ожидаемый результат

After building and running the executable, you should see output confirming that SDL3, SDL3_image, and WebGPU Native initialized successfully: После сборки и запуска исполняемого файла вы должны увидеть вывод, подтверждающий успешную инициализацию SDL3, SDL3_image и WebGPU Native:

C:\projects\webgpu-sdl3-image-starter>run-exe
SDL3_image warning: Could not load 'test.png' (Couldn't open test.png: The system cannot find the file specified.), but SDL3_image library is linked and initialized properly!
SDL3, SDL3_image, and WebGPU Native initialized successfully!

Support My Work Поддержать проект

If these tutorials helped you, consider buying me a coffee! Если эти туториалы вам помогли, вы можете поддержать автора.

Sberbank (Russia only) Сбербанк (только для РФ)

Sberbank SBP QR Code

Direct transfer via phone number (Russia only) Перевод по номеру телефона (только для РФ)

+7 (917) 212-29-59

USDT TRC20

USDT TRC20 QR Code

Support via Cryptocurrency Поддержка криптовалютой

TMtY1YifNf6FKvgeFmqKGQR4NStKr3csGp