一、环境介绍
操作系统: ubutu18.04 64位
二、SDL介绍
(Simple DirectMedia Layer)是一个自由的跨平台的多媒体开发包,适用于游戏、游戏SDK、演示软件、模拟器、MPEG播放器和其他应用软件,用途广泛。
SDL提供了数种控制图像、声音、输出入的函数,让开发者只要用相同或是相似的代码就可以开发出跨多个平台(Linux、Windows、Mac OS X等)的应用软件。
这里使用较新的SDL2库进行编译安装。
三、下载编译SDL2
3.1 下载SDL2
下载地址: http://www.linuxfromscratch.org/blfs/view/cvs/multimedia/sdl2.html
3.2 解压编译
wbyq@wbyq:~/work_pc$ tar xvf /mnt/hgfs/linux-share-dir/SDL2-2.0.12.tar.gz wbyq@wbyq:~/work_pc/SDL2-2.0.12$ ./configure --prefix=$PWD/_install wbyq@wbyq:~/work_pc/SDL2-2.0.12$ make && make install wbyq@wbyq:~/work_pc/SDL2-2.0.12$ cd _install/ wbyq@wbyq:~/work_pc/SDL2-2.0.12/_install$ ls bin include lib share wbyq@wbyq:~/work_pc/SDL2-2.0.12/_install$ tree . ├── bin │ └── sdl2-config ├── include │ └── SDL2 │ ├── begin_code.h │ ├── close_code.h │ ├── SDL_assert.h │ ├── SDL_atomic.h │ ├── SDL_audio.h │ ├── SDL_bits.h │ ├── SDL_blendmode.h │ ├── SDL_clipboard.h │ ├── SDL_config.h │ ├── SDL_cpuinfo.h │ ├── SDL_egl.h │ ├── SDL_endian.h │ ├── SDL_error.h │ ├── SDL_events.h │ ├── SDL_filesystem.h │ ├── SDL_gamecontroller.h │ ├── SDL_gesture.h │ ├── SDL.h │ ├── SDL_haptic.h │ ├── SDL_hints.h │ ├── SDL_joystick.h │ ├── SDL_keyboard.h │ ├── SDL_keycode.h │ ├── SDL_loadso.h │ ├── SDL_log.h │ ├── SDL_main.h │ ├── SDL_messagebox.h │ ├── SDL_metal.h │ ├── SDL_mouse.h │ ├── SDL_mutex.h │ ├── SDL_name.h │ ├── SDL_opengles2_gl2ext.h │ ├── SDL_opengles2_gl2.h │ ├── SDL_opengles2_gl2platform.h │ ├── SDL_opengles2.h │ ├── SDL_opengles2_khrplatform.h │ ├── SDL_opengles.h │ ├── SDL_opengl_glext.h │ ├── SDL_opengl.h │ ├── SDL_pixels.h │ ├── SDL_platform.h │ ├── SDL_power.h │ ├── SDL_quit.h │ ├── SDL_rect.h │ ├── SDL_render.h │ ├── SDL_revision.h │ ├── SDL_rwops.h │ ├── SDL_scancode.h │ ├── SDL_sensor.h │ ├── SDL_shape.h │ ├── SDL_stdinc.h │ ├── SDL_surface.h │ ├── SDL_system.h │ ├── SDL_syswm.h │ ├── SDL_test_assert.h │ ├── SDL_test_common.h │ ├── SDL_test_compare.h │ ├── SDL_test_crc32.h │ ├── SDL_test_font.h │ ├── SDL_test_fuzzer.h │ ├── SDL_test.h │ ├── SDL_test_harness.h │ ├── SDL_test_images.h │ ├── SDL_test_log.h │ ├── SDL_test_md5.h │ ├── SDL_test_memory.h │ ├── SDL_test_random.h │ ├── SDL_thread.h │ ├── SDL_timer.h │ ├── SDL_touch.h │ ├── SDL_types.h │ ├── SDL_version.h │ ├── SDL_video.h │ └── SDL_vulkan.h ├── lib │ ├── cmake │ │ └── SDL2 │ │ ├── sdl2-config.cmake │ │ └── sdl2-config-version.cmake │ ├── libSDL2-2.0.so.0 -> libSDL2-2.0.so.0.12.0 │ ├── libSDL2-2.0.so.0.12.0 │ ├── libSDL2.a │ ├── libSDL2.la │ ├── libSDL2main.a │ ├── libSDL2main.la │ ├── libSDL2.so -> libSDL2-2.0.so.0.12.0 │ ├── libSDL2_test.a │ ├── libSDL2_test.la │ └── pkgconfig │ └── sdl2.pc └── share └── aclocal └── sdl2.m4 9 directories, 88 files
3.3 将SDL2库安装的路径加入系统LD_LIBRARY_PATH环境变量
因为前面配置了SDL的库安装编译的目录在当前_install目录下,为了编译程序之后,运行程序能找到SDL2的库,需要将库的路径加入到系统环境变量里。可以直接在命令行执行下面代码,或者写一个脚本开机自动运行。
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/wbyq/work_pc/SDL2-2.0.12/_install/lib
四、测试SDL
下面代码使用SDL库打开窗口显示一张BMP图片。
4.1 源代码
#include <iostream> #include <SDL.h> int main(int argc, char** argv) { //初始化SDL if (SDL_Init(SDL_INIT_VIDEO) != 0) { std::cout << "SDL_Init Error: " << SDL_GetError() << std::endl; return 1; } //创建窗口 SDL_Window *win = nullptr; win = SDL_CreateWindow("Hello SDL2", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, 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("888.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(5000); //释放资源 SDL_DestroyTexture(tex); SDL_DestroyRenderer(ren); SDL_DestroyWindow(win); //退出SDL SDL_Quit(); return 0; }
4.2 Makefile文件
CC=g++ all: $(CC) sdl_display.c -o app -I/home/wbyq/work_pc/SDL2-2.0.12/_install/include -I/home/wbyq/work_pc/SDL2-2.0.12/_install/include/SDL2 -lSDL2 -L/home/wbyq/work_pc/SDL2-2.0.12/_install/lib -lpthread -lm -ldl
4.3 测试效果