从头开始构建简单的 SDL2 应用程序
本页面展示了如何使用 Meson 从头开始定义和构建 SDL2 GUI 应用程序。文档针对 Windows 编写,因为它是最复杂的平台,但基本思路在 Linux 和 macOS 上也适用。
示例应用程序用纯 C 编写,因为 SDL 2 也用 C 编写。如果你更喜欢 C++,转换相当简单,留给读者练习。
本文档假设你已经安装了 Visual Studio 和 Meson。
设置构建目录
首先,你需要为所有东西创建一个空目录。Visual Studio 工具链有点特殊,它要求你在特定 shell 中运行构建。可以通过打开应用程序菜单,然后选择“Visual Studio
它会把你放到一个奇怪的目录中,因此你需要进入你的主目录
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 有一个用于下载和构建(如果需要)依赖项的网络服务,称为 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])
除了依赖项之外,它还有一些其他的更改。首先,我们指定要以静态方式构建辅助库。对于像这样的简单项目,它会使事情变得更简单。我们还需要告诉 Meson,我们正在构建的程序是一个 Windows GUI 应用程序,而不是一个控制台应用程序。
这就是我们需要做的所有事情,现在可以再次运行 meson compile
。首先,系统会下载并配置 SDL2
过了一会儿,编译成功退出。
程序已完成
现在,我们可以使用以下命令运行该应用程序
builddir\sdlprog
最终结果是一个黑色的 SDL 窗口。
搜索结果为