SDL2_gfx 静态编译教程

SDL2_gfx Demo

我在文章SDL2 游戏开发之图形渲染(续)中提到过,SDL 本身只提供了很简单的图形绘制接口,如果你想要绘制椭圆、弧形之类的图形,需要根据数学公式自己绘制。

有些大佬为了方便,基于 SDL 扩展出一些额外的图形绘制接口,SDL2_gfx 就是其中一种。这个库最后更新在 2018年,官网在这里,库本身是第三方开发的,并不在 SDL 官方支持的序列中。

因为源码已经很旧了,最后的版本是 1.0.4。这个版本可以在 Windows 下编译,也提供了编译工程,但是默认没有配置 64 位的解决方案,并且编译的结果仅仅是动态库。如果你想要静态库或者64位的支持,则需要手动修改工程属性。

本篇文章就是为了解决上述问题,记录了 SDL2_gfx 在 Windows 平台下如何编译 64 静态库的教程。

1. 下载源码

首先去官网下载最新的源码,当前最新版本是 SDL2_gfx-1.0.4。

sdl2_gfx 官网

2. 创建工程

下载完解压,发现 SDL2_gfx 的代码很少,只有几个文件。所以这里不准备修改原有的工程,而是使用新建工程的方式创建一个可以编译出 64 位的静态库工程。

首先,创建一个工程:

创建项目

选择 Window 桌面向导,点击下一步:

配置新项目输入项目名称 SDL2_gfx,点击创建:

Windows 桌面项目

在弹出的对话框中选择静态库空项目,点击确定。

解决方案

咱们的静态库工程已经创建完毕。接下来去 SDL2_gfx 的目录下,复制代码到工程文件中:

sdl2_gfx 代码文件

复制到项目目录下之后,点击工程名称,右键,将 SDL2_gfx 源码加入到项目中:

引入 sdl2_gfx 文件

添加完成后的效果如下:

sdl2_gfx 工程

这时候你编译,会发现缺少 SDL 相关信息,所以下一步你需要将 SDL 的头文件添加到项目中。选择项目,右键,属性,弹出属性页:

引入 SDL2 头文件

注意,左上角选择所有配置,点击 C/C++ 常规面板,右侧附加包含目中添加 SDL 的头文件目录。然后点击确定,F7 生成静态库。

注意工具栏需要选择 x64 位,否则编译出来的是 32 位静态库。

工具栏

如果一切顺利,你已经得到了 SDL2_gfx 的 64 位静态库。

sdl2_gfx 编译结果

我们的最终目的是为了生成静态库,但是按照 Debug/Release 和 /MT 以及 /MD 之分,至少可以组合四种配置,所以我们分别选择不同的配置属性,生成最后的四种库文件,并将它们放到不同的目录下。具体的配置方法可以查看 运行时库详解 这篇文章,每次修改配置都编译一次工程,编译成功后,将生成的结果放到一开始设定的目录下,最后的目录结构如下:

---
 |--- include //放头文件
 |--- lib
       |--- Debug
       |      |--- MDd
       |      |     |-- SDL2_gfx.lib
       |      |
       |      |--- MTd
       |            |-- SDL2_gfx.lib
       |
       |--- Release
              |--- MD
              |     |-- SDL2_gfx.lib
              |
              |--- MT
                    |-- SDL2_gfx.lib

注意: SDL2_gfx 依赖的 SDL2 静态库也需要同样的配置(Debug 对应 Debug,Release 对应 Release,并且 MD 对应 MD,MT 对应 MT),否则可能编译的时候会出现如下的警告信息。

LINK : warning LNK4098: 默认库“LIBCMTD”与其他库的使用冲突;请使用 /NODEFAULTLIB:library

3. 测试

因为我没准备用这个库,所以没有仔细研究,仅仅尝试编译了它项目中的一个测试工程 TestFramerate,不知道为什么,可能因为年代久远之类的原因,测试程序中存在几处错误。

运行程序的时候,会发现找不到 SDLTest_CommonUsage 函数。这个错误应该是由于 SDL2 函数进化造成的,最新的库中已经被 SDLTest_CommonLogUsage 函数替代,代码可以改成:

//SDL_Log("Usage: %s %s [--x #] [--y #]\n",
//	argv[0], SDLTest_CommonUsage(state));
const char* use = "Usage: %s %s [--x #] [--y #]\n";
SDLTest_CommonLogUsage(state, argv[0], &use);

这样再加入 SDL 头文件之后,就应该可以编译通过了。不过在关闭程序的时候,会触发一个断言:

'renderer && renderer->magic == &renderer_magic'

查看代码发现应该是由指针为空造成的,猜测是因为程序退出已经销毁了渲染设备,这时候在使用渲染设备绘制图形,肯定会报错。修改起来也很简单,只需要在事件处理之前进行绘制即可:

while (!done) {
	/* Do all the drawing work */
	Draw(state->renderers[0], &fpsm);

	/* Check for events */
	++frames;
	while (SDL_PollEvent(&event) && !done) {
		SDLTest_CommonEvent(state, &event, &done);
	}
}

改完后,编译程序,退出程序虽然不会报断言错误,但是仍然会触发一个断点,查看代码原来是因为使用 free 函数释放 SDL_malloc 申请的字符串造成的,只需要将 free 换成 SDL_free 就行了。

/* Free common message buffer */
if (messageText) {
	//free(messageText);
	SDL_free(messageText);
}

只尝试运行这一个测试程序,就报了三个错误,不知道其它测试程序能否正常运行,不过因为年久失修,也可以理解,如果大家真的准备用这个库,那就仔细研究一下,不过不用担心,毕竟也就那几个文件,扫几眼也就差不多熟悉了,你说是吧!😉

SDL2_gfx 测试程序运行结果

大佬,给点反馈?

平均评分 / 5. 投票数:

很抱歉,这篇文章不能帮助到你

请让我们改进这篇文章

告诉我们我们如何改善这篇文章?

发表评论

邮箱地址不会被公开。 必填项已用*标注