这段时间项目要求将一个cpp程序运行在linux操作系统上,其中程序用到了SDL2的相关的头文件和库。在安装SDL2的包的时候遇到了不少问题,借此机会记录一下。
安装过程参考了Linux下编译安装SDL2这篇博客。
0. 安装PulseAudio和ALSA
非常重要!!必须一开始先安装好。原先我没有做这一步,好不容易把后续步骤做完了。但在调用SDL_OpenAudio函数时失败,报错原因是no such audio device。 后来找到原因是没有获得PulseAudio和ALSA的支持,在安装这两个音频接口支持后还得把后续的步骤重新做一遍,花了很长时间。
sudo apt-get install libasound2-dev libpulse-dev 一定要最开始做!!
1. 下载SDL2源码库(下载地址)
2. 安装环境配置
$ tar xvf SDL2-2.0.14.tar.gz 解压
$ apt --fix-broken install
$ cd SDL2-2.0.14/
$ ./configure --prefix=$PWD/_install 配置安装环境
做到上一步的时候终端报了一个错
configure: error: in `/home/linux-myl/SDL2-2.0.14':
configure: error: C compiler cannot create executables
感觉是gcc的编译环境没有配置好,所以重新安装配置一下gcc
$ apt-get install gcc libc6-dev
在安装时又出现了如下的错误
libc6-dev : Depends: libc6 (= 2.23-0ubuntu11.3) but 2.27-3ubuntu1.2 is to be installed
在网上搜了一下,说是源的版本没有更新。尝试使用sudo apt-get update
,发现已经是最新版本了。于是索性换源,原来我用的是清华源,换成了阿里源。阿里源的网址以及换源的过程见这个博客。
换源后重新安装gcc,重新执行./configure --prefix=$PWD/_install
,发现没有抱错,安装环境配置OK。
3. 安装
$ make clean
$ make && make install
$ cd _install/
$ tree _install目录的树状结构
.
├── 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_locale.h
│ ├── SDL_log.h
│ ├── SDL_main.h
│ ├── SDL_messagebox.h
│ ├── SDL_metal.h
│ ├── SDL_misc.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.14.0
│ ├── libSDL2-2.0.so.0.14.0
│ ├── libSDL2.a
│ ├── libSDL2.la
│ ├── libSDL2main.a
│ ├── libSDL2main.la
│ ├── libSDL2.so -> libSDL2-2.0.so.0.14.0
│ ├── libSDL2_test.a
│ ├── libSDL2_test.la
│ └── pkgconfig
│ └── sdl2.pc
└── share
└── aclocal
└── sdl2.m4
9 directories, 90 files
4. 系统LD_LIBRARY_PATH环境变量配置
最后为了方便其他程序在链接时能够找到SDL2的库,需要将SDL2库的路径加入到系统的环境变量中。
$ export LD_LIBRARY_PATH=$LD_LIBRARY_PTAH:/home/linux-myl/SDL2-2.0.14/_install/lib
如果路径写错了重新添加时需要删除原先错误的路径,重置LD_LIBRARY_PATH。
$ unset LD_LIBRARY_PATH
还需要注意的是export这种方法在终端被关闭后,LD_LIBRARY_PATH会清除之前做的操作。所以下次打开终端时还得重新往环境变量放入SDL2库的路径。
至此,SDL2就安装好了,后续调用时只需要在Makefile中指明SDL2安装时_install文件夹下的include和lib位置就可以使用SDL2的函数功能啦!!