從零開始建構一個簡單的 SDL2 應用程式

這個頁面從頭開始展示如何僅使用 Meson 來定義和建構一個 SDL2 圖形使用者介面應用程式。本文檔針對 Windows 編寫,因為它是最複雜的平台,但相同的基本概念也應該適用於 Linux 和 macOS。

範例應用程式是用純 C 語言編寫的,因為 SDL 2 也是用 C 語言編寫的。如果您更喜歡 C++,轉換相當簡單,並且留給讀者作為練習。

本文檔假設您已經安裝了 Visual Studio 和 Meson。

設定建構目錄

首先,您需要為您的所有內容建立一個空的目錄。 Visual Studio 工具鏈有點不尋常,它要求您從特定的 shell 執行建構。這可以透過開啟應用程式選單,然後選擇 Visual Studio <year> -> x86_64 native tools command prompt 來找到。

它會將您放入一個奇怪的目錄中,因此您需要前往您的主目錄

cd \users\yourusername

通常你會輸入 cd \users\ 然後按下 Tab 鍵,讓 shell 自動完成使用者名稱。完成後,您可以建立目錄。

mkdir sdldemo
cd sdldemo

建立範例程式

現在我們需要建立一個原始程式碼檔案和一個 Meson 建構定義檔案。我們根本不會使用 SDL,而是從一個只印出一些文字的簡單程式開始。一旦我們讓它運作起來,我們可以擴充它來執行圖形操作。原始程式碼進入名為 sdlprog.c 的檔案,並具有以下內容

#include <stdio.h>

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

建構定義進入一個名為 meson.build 的檔案,看起來像這樣

project('sdldemo', 'c')

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

完成此操作後,我們可以透過以下命令開始建構

meson setup builddir

這裡的 builddir建構目錄,建構期間產生的一切都會放入該目錄。執行時,它應該看起來像這樣。

Configuring the sample application

程式會使用這個來編譯

meson compile -C builddir

-C 參數告訴 Meson 設定好的建構目錄在哪裡。

程式將位於建構目錄中,可以像這樣執行

builddir\sdlprog

輸出應該看起來像這樣。

Running the sample application

升級程式以使用 SDL

啟動 SDL 所需的程式碼有點複雜,我們不會深入探討它是如何運作的。只需將 sdlprog.c 的內容替換為以下內容

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

讓我們嘗試再次執行 meson compile -C builddir 來編譯它。

Building SDL app fails

這失敗了。原因是因為我們目前沒有可用的 SDL。我們需要以某種方式取得它。更技術性的術語是,SDL2 是一個外部相依性,取得它稱為相依性解析

Meson 有一個用於下載和建構(如果需要)相依性的 Web 服務,稱為 WrapDB。它提供了 SDL2,因此我們可以直接使用它。首先,我們需要建立一個 subprojects 目錄,因為在 Meson 中,所有像這樣的子專案都必須儲存在該目錄中以保持一致性。

mkdir subprojects

然後我們可以安裝相依性

meson wrap install sdl2

看起來像這樣

Obtaining SDL2 from WrapDB

最後一步,我們需要更新我們的建構定義檔案以使用新取得的相依性。

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

sdl2_dep = dependency('sdl2')

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

注意: 如果您在 Windows 上,您還需要包含 sdl2main 相依性;為此,您可以像這樣修改上面的建構腳本

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])

除了相依性之外,這還有一些其他的變更。首先,我們指定我們要靜態地建構 helper 函式庫。對於像這樣的簡單專案,它會讓事情變得更簡單。我們還需要告訴 Meson 我們正在建構的程式是一個 Windows GUI 應用程式,而不是一個主控台應用程式。

這就是我們需要做的一切,現在可以再次執行 meson compile。首先,系統會下載並設定 SDL2

Running the sample application

稍後,編譯會成功結束。

Running the sample application

程式已完成

現在我們可以執行應用程式,使用

builddir\sdlprog

最終結果是一個黑色的 SDL 視窗。

Running the sample application

搜尋結果如下