Aufbau einer einfachen SDL2-Anwendung von Grund auf

Diese Seite zeigt von Grund auf, wie eine SDL2-GUI-Anwendung mit nichts als Meson definiert und erstellt wird. Das Dokument ist für Windows geschrieben, da dies die komplexeste Plattform ist, aber die gleichen grundlegenden Ideen sollten auch unter Linux und macOS funktionieren.

Die Beispielanwendung ist in reinem C geschrieben, da SDL 2 ebenfalls in C geschrieben ist. Wenn Sie stattdessen C++ bevorzugen, ist die Konvertierung recht einfach und bleibt als Übung für den Leser überlassen.

Dieses Dokument setzt voraus, dass Sie sowohl Visual Studio als auch Meson bereits installiert haben.

Einrichten des Build-Verzeichnisses

Zuerst müssen Sie ein leeres Verzeichnis für all Ihre Sachen erstellen. Die Visual Studio Toolchain ist etwas ungewöhnlich, da sie verlangt, dass Sie Ihre Builds von einer bestimmten Shell ausführen. Diese finden Sie, indem Sie das Anwendungsmenü öffnen und dann Visual Studio <Jahr> -> x86_64 native tools command prompt auswählen.

Dies wird Sie in ein komisches Verzeichnis versetzen, daher müssen Sie zu Ihrem Home-Verzeichnis wechseln

cd \users\yourusername

Typischerweise würden Sie cd \users\ eingeben und dann die Tabulator-Taste drücken, damit die Shell den Benutzernamen vervollständigt. Sobald dies erledigt ist, können Sie das Verzeichnis erstellen.

mkdir sdldemo
cd sdldemo

Erstellen des Beispielprogramms

Nun müssen wir eine Quelldatei und eine Meson-Build-Definitionsdatei erstellen. Wir werden SDL überhaupt nicht verwenden, sondern mit einem einfachen Programm beginnen, das nur Text ausgibt. Sobald wir es zum Laufen gebracht haben, können wir es erweitern, um Grafiken zu erzeugen. Der Quellcode kommt in eine Datei sdlprog.c und hat den folgenden Inhalt

#include <stdio.h>

int main(int argc, char **argv) {
  printf("App is running.\n");
  return 0;
}

Die Build-Definition kommt in eine Datei namens meson.build und sieht so aus

project('sdldemo', 'c')

executable('sdlprog', 'sdlprog.c')

Wenn dies erledigt ist, können wir den Build mit dem folgenden Befehl starten

meson setup builddir

Hier ist builddir das Build-Verzeichnis, alles, was während des Builds generiert wird, wird in diesem Verzeichnis abgelegt. Wenn es ausgeführt wird, sollte es so aussehen.

Configuring the sample application

Das Programm wird damit kompiliert

meson compile -C builddir

Das Argument -C teilt Meson mit, wo sich das konfigurierte Build-Verzeichnis befindet.

Das Programm befindet sich im Build-Verzeichnis und kann wie folgt ausgeführt werden

builddir\sdlprog

Die Ausgabe sollte so aussehen.

Running the sample application

Aktualisieren des Programms zur Verwendung von SDL

Der Code zum Starten von SDL ist etwas komplizierter und wir werden nicht darauf eingehen, wie er funktioniert. Ersetzen Sie lediglich den Inhalt von sdlprog.c durch Folgendes

#include "SDL.h"

int main(int argc, char *argv[])
{
    SDL_Window *window;
    SDL_Renderer *renderer;
    SDL_Surface *surface;
    SDL_Event event;

    if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't initialize SDL: %s", SDL_GetError());
        return 3;
    }

    if (SDL_CreateWindowAndRenderer(320, 240, SDL_WINDOW_RESIZABLE, &window, &renderer)) {
        SDL_LogError(SDL_LOG_CATEGORY_APPLICATION, "Couldn't create window and renderer: %s", SDL_GetError());
        return 3;
    }

    while (1) {
        SDL_PollEvent(&event);
        if (event.type == SDL_QUIT) {
            break;
        }
        SDL_SetRenderDrawColor(renderer, 0x00, 0x00, 0x00, 0x00);
        SDL_RenderClear(renderer);
        SDL_RenderPresent(renderer);
    }

    SDL_DestroyRenderer(renderer);
    SDL_DestroyWindow(window);

    SDL_Quit();

    return 0;
}

Versuchen wir, dies zu kompilieren, indem wir erneut meson compile -C builddir ausführen.

Building SDL app fails

Das schlägt fehl. Der Grund dafür ist, dass wir SDL derzeit nicht verfügbar haben. Wir müssen es irgendwie beschaffen. In technischeren Begriffen ist SDL2 eine externe Abhängigkeit und das Beschaffen wird als Abhängigkeitsauflösung bezeichnet.

Meson hat einen Webdienst zum Herunterladen und Erstellen (falls erforderlich) von Abhängigkeiten namens WrapDB. Er stellt SDL2 zur Verfügung, damit wir es direkt verwenden können. Zuerst müssen wir ein Verzeichnis subprojects erstellen, da in Meson alle Unterprojekte wie diese aus Konsistenzgründen in diesem Verzeichnis gespeichert werden müssen.

mkdir subprojects

Dann können wir die Abhängigkeit installieren

meson wrap install sdl2

Es sieht so aus

Obtaining SDL2 from WrapDB

Als letzten Schritt müssen wir unsere Build-Definitionsdatei aktualisieren, um die neu erhaltene Abhängigkeit zu verwenden.

project('sdldemo', 'c',
        default_options: 'default_library=static')

sdl2_dep = dependency('sdl2')

executable('sdlprog', 'sdlprog.c',
           win_subsystem: 'windows',
           dependencies: sdl2_dep)

HINWEIS: Wenn Sie unter Windows sind, müssen Sie auch die sdl2main-Abhängigkeit einbeziehen; Um dies zu tun, können Sie das obige Build-Skript wie folgt ändern

project('sdldemo', 'c',
        default_options: 'default_library=static')

sdl2_dep = dependency('sdl2')
sdl2_main_dep = dependency('sdl2main')

executable('sdlprog', 'sdlprog.c',
           win_subsystem: 'windows',
           dependencies: [sdl2_dep, sdl2_main_dep])

Zusätzlich zur Abhängigkeit gibt es noch ein paar andere Änderungen. Erstens geben wir an, dass wir Hilfsbibliotheken statisch bauen wollen. Für einfache Projekte wie diese vereinfacht dies die Dinge. Wir müssen Meson auch mitteilen, dass das Programm, das wir bauen, eine Windows-GUI-Anwendung und keine Konsolenanwendung ist.

Das ist alles, was wir tun müssen, und können nun erneut meson compile ausführen. Zuerst lädt und konfiguriert das System SDL2

Running the sample application

Kurz darauf wird die Kompilierung erfolgreich beendet.

Running the sample application

Programm ist fertig

Jetzt können wir die Anwendung mit

builddir\sdlprog

Das Endergebnis ist ein schwarzes SDL-Fenster.

Running the sample application

Die Ergebnisse der Suche sind