從零開始建構一個簡單的 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
是建構目錄,建構期間產生的一切都會放入該目錄。執行時,它應該看起來像這樣。
程式會使用這個來編譯
meson compile -C builddir
-C
參數告訴 Meson 設定好的建構目錄在哪裡。
程式將位於建構目錄中,可以像這樣執行
builddir\sdlprog
輸出應該看起來像這樣。
升級程式以使用 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
來編譯它。
這失敗了。原因是因為我們目前沒有可用的 SDL。我們需要以某種方式取得它。更技術性的術語是,SDL2 是一個外部相依性,取得它稱為相依性解析。
Meson 有一個用於下載和建構(如果需要)相依性的 Web 服務,稱為 WrapDB。它提供了 SDL2,因此我們可以直接使用它。首先,我們需要建立一個 subprojects
目錄,因為在 Meson 中,所有像這樣的子專案都必須儲存在該目錄中以保持一致性。
mkdir subprojects
然後我們可以安裝相依性
meson wrap install sdl2
看起來像這樣
最後一步,我們需要更新我們的建構定義檔案以使用新取得的相依性。
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
稍後,編譯會成功結束。
程式已完成
現在我們可以執行應用程式,使用
builddir\sdlprog
最終結果是一個黑色的 SDL 視窗。
搜尋結果如下