SDL2_gfx 静态编译教程
- W_Z_C
- 共 1556 字,阅读约 4 分钟
我在文章SDL2 游戏开发之图形渲染(续)中提到过,SDL 本身只提供了很简单的图形绘制接口,如果你想要绘制椭圆、弧形之类的图形,需要根据数学公式自己绘制。
有些大佬为了方便,基于 SDL 扩展出一些额外的图形绘制接口,SDL2_gfx 就是其中一种。这个库最后更新在 2018年, 官网在这里,库本身是第三方开发的,并不在 SDL 官方支持的序列中。
因为源码已经很旧了,最后的版本是 1.0.4。这个版本可以在 Windows 下编译,也提供了编译工程,但是默认没有配置 64 位的解决方案,并且编译的结果仅仅是动态库。如果你想要静态库或者64位的支持,则需要手动修改工程属性。
本篇文章就是为了解决上述问题,记录了 SDL2_gfx 在 Windows 平台下如何编译 64 静态库的教程。
1. 下载源码
首先去官网下载最新的源码,当前最新版本是 SDL2_gfx-1.0.4。
2. 创建工程
下载完解压,发现 SDL2_gfx 的代码很少,只有几个文件。所以这里不准备修改原有的工程,而是使用新建工程的方式创建一个可以编译出 64 位的静态库工程。
首先,创建一个工程:
选择 Window 桌面向导,点击下一步:
输入项目名称 SDL2_gfx,点击创建:
在弹出的对话框中选择静态库,空项目,点击确定。
咱们的静态库工程已经创建完毕。接下来去 SDL2_gfx 的目录下,复制代码到工程文件中:
复制到项目目录下之后,点击工程名称,右键,将 SDL2_gfx 源码加入到项目中:
添加完成后的效果如下:
这时候你编译,会发现缺少 SDL 相关信息,所以下一步你需要将 SDL 的头文件添加到项目中。选择项目,右键,属性,弹出属性页:
左上角选择所有配置,点击 C/C++ 常规面板,右侧附加包含目中添加 SDL 的头文件目录。然后点击确定,F7 生成静态库。
注意工具栏需要选择 x64 位,否则编译出来的是 32 位静态库。
如果一切顺利,你已经得到了 SDL2_gfx 的 64 位静态库。
我们的最终目的是为了生成静态库,但是按照 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);
}
只尝试运行这一个测试程序,就报了三个错误,不知道其它测试程序能否正常运行,不过因为年久失修,也可以理解,如果大家真的准备用这个库,那就仔细研究一下,不过不用担心,毕竟也就那几个文件,扫几眼也就差不多熟悉了,你说是吧!😉