SDL2安装指南

2006世界杯 2025-06-19 21:56:28 5607

SDL(Simple DirectMedia Layer)是一套开放源代码的跨平台多媒体开发库,使用C语言写成。SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。目前SDL多用于开发游戏、模拟器、媒体播放器等多媒体应用领域。下面主要介绍一下在Windows下搭建SDL2开发环境的过程。

下载下载自SDL官网,在Development Libraries中选择相应的版本。我这里选择的是Windows平台下的Visual C++版,因为我接下来使用的环境是VS2013。

文件把文件下载下来解压后的文档树应该是这样的:

代码语言:javascript代码运行次数:0运行复制└─SDL2-2.0.4

│ BUGS.txt

│ COPYING.txt

│ README-SDL.txt

│ README.txt

│ WhatsNew.txt

├─docs

│ doxyfile

│ README-android.md

│ README-cmake.md

│ README-directfb.md

│ ......

├─include

│ begin_code.h

│ close_code.h

│ SDL.h

│ SDL_assert.h

│ SDL_atomic.h

│ SDL_audio.h

│ ......

└─lib

├─x64

│ SDL2.dll

│ SDL2.lib

│ SDL2main.lib

│ SDL2test.lib

└─x86

SDL2.dll

SDL2.lib

SDL2main.lib

SDL2test.lib主要包含使用说明、doc文档、头文件、以及库文件。这里的库文件包括x86和x64两种架构的,每种都含有一个动态链接库和三个静态链接库。

VS中的项目配置SDL2说白了其实只是一个C语言库,因此配置他就跟配置其他任意的库一样,主要分为三步:

一、包含必需的头文件和库文件

因为我们需要能够include进SDL2的头文件,并且找到对应的实现代码(库文件),所以我们必需得让编译器能够找到他们。因此我们只需要在工程的项目->属性->配置属性->VC++目录< 里配置好相应的路径:

也就是修改图中的包含目录以及库目录,分别对应之前的include文件夹,以及lib/x86文件夹(VS默认的是x86架构)。

二、添加编译指令

既然用了第三方的库,那么我们在进行编译的时候肯定需要加上-l指令,从而指定编译进去的静态链接库。而按照微软一贯的保姆式作风,在VS中并不需要我们手动输入编译指令,只需要修改一下编译配置,然后就能直接编译了。这个配置在项目->属性->配置属性->链接器->输入->附加依赖项< 这里:

在这里面加上那三个静态库的名字即可(SDL2.lib、SDL2main.lib、SDL2test.lib)。

三、配置动态库

只配置了静态库已经是可以编译的了,但却是无法调试的,因为程序运行需要SDL2.dll这个动态库的支持。那么我们只需要将SDL2.dll加入电脑的PATH环境变量里或者是工程目录下,从而保证程序能找到他。

最后,针对SDL2还需要额外设置一个配置,就是程序的入口,具体原因不明。配置方法就是修改项目->属性->配置属性->链接器->系统->子系统,内容改成"窗口 (/SUBSYSTEM:WINDOWS)"即可:

搞好上面这个配置,理论上就能跑SDL2的程序了,那我就直接把下面这个显示图片的程序作为Hello World来测试一下吧:

代码语言:javascript代码运行次数:0运行复制#include "SDL.h"

#include

using namespace std;

int main(int argc, char** argv){

if (SDL_Init(SDL_INIT_EVERYTHING) == -1){

std::cout << SDL_GetError() << std::endl;

return 1;

}

SDL_Window *win = nullptr;

win = SDL_CreateWindow("Hello World!", 100, 100, 640, 480, SDL_WINDOW_SHOWN);

if (win == nullptr){

std::cout << SDL_GetError() << std::endl;

return 1;

}

SDL_Renderer *ren = nullptr;

ren = SDL_CreateRenderer(win, -1, SDL_RENDERER_ACCELERATED | SDL_RENDERER_PRESENTVSYNC);

if (ren == nullptr){

std::cout << SDL_GetError() << std::endl;

return 1;

}

SDL_Surface *bmp = nullptr;

bmp = SDL_LoadBMP("test.bmp");

if (bmp == nullptr){

std::cout << SDL_GetError() << std::endl;

return 1;

}

SDL_Texture *tex = nullptr;

tex = SDL_CreateTextureFromSurface(ren, bmp);

SDL_FreeSurface(bmp);

SDL_RenderClear(ren);

SDL_RenderCopy(ren, tex, NULL, NULL);

SDL_RenderPresent(ren);

SDL_Delay(2000);

SDL_DestroyTexture(tex);

SDL_DestroyRenderer(ren);

SDL_DestroyWindow(win);

SDL_Quit();

return 0;

}程序运行的结果就是显示test.bmp两秒钟。

站点统计