从头开始构建简单的 SDL2 应用程序

本页面展示了如何使用 Meson 从头开始定义和构建 SDL2 GUI 应用程序。文档针对 Windows 编写,因为它是最复杂的平台,但基本思路在 Linux 和 macOS 上也适用。

示例应用程序用纯 C 编写,因为 SDL 2 也用 C 编写。如果你更喜欢 C++,转换相当简单,留给读者练习。

本文档假设你已经安装了 Visual Studio 和 Meson。

设置构建目录

首先,你需要为所有东西创建一个空目录。Visual Studio 工具链有点特殊,它要求你在特定 shell 中运行构建。可以通过打开应用程序菜单,然后选择“Visual Studio -> x86_64 本地工具命令提示符”找到它。

它会把你放到一个奇怪的目录中,因此你需要进入你的主目录

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 有一个用于下载和构建(如果需要)依赖项的网络服务,称为 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])

除了依赖项之外,它还有一些其他的更改。首先,我们指定要以静态方式构建辅助库。对于像这样的简单项目,它会使事情变得更简单。我们还需要告诉 Meson,我们正在构建的程序是一个 Windows GUI 应用程序,而不是一个控制台应用程序。

这就是我们需要做的所有事情,现在可以再次运行 meson compile。首先,系统会下载并配置 SDL2

Running the sample application

过了一会儿,编译成功退出。

Running the sample application

程序已完成

现在,我们可以使用以下命令运行该应用程序

builddir\sdlprog

最终结果是一个黑色的 SDL 窗口。

Running the sample application

搜索结果为