SDL2显示PNG图片+播放MP3

在使用SDL时,发现就算编译安装了SDL2_image和SDL_mixer也无法显示png格式图片和播放MP3音频文件。在网上搜索许久,这里总结一下编译过程。。。

SDL2_image

首先,我是用一下函数获取错误的信息的

1
2
_texture=IMG_LoadTexture(_renderer,filename.c_str());
cout<< SDL_GetError()<<endl;

错误信息如下:
Failed loading png_set_longjmp_fn: /lib/x86_64-linux-gnu/libpng12.so.0: undefined symbol: _png_set_longjmp_fn

可看到,libpng12.so 这个库文件位定义函数符号 png_set_longjmp_fn

接着我查找 libpng12.so 这个库文件

1
2
3
4
5
6
7
8
$ locate libpng|grep "so"
/lib/x86_64-linux-gnu/libpng12.so.0
/lib/x86_64-linux-gnu/libpng12.so.0.49.0
/usr/lib/x86_64-linux-gnu/libpng.so
/usr/lib/x86_64-linux-gnu/libpng16.so
/usr/lib/x86_64-linux-gnu/libpng16.so.16
/usr/lib/x86_64-linux-gnu/libpng16.so.16.34.0

可看到系统存在两个版本的 libpng 库 。如果只存在一个,那么可以自行下载libpng最新版本编译安装,并继续以下操作。
其中 libpng12.so.0.49.0 是一个比较老的版本了。所以与最新的SDL2可能不兼容,才会出现上面的那个错误。知道的问题后,解决起来似乎也变得简单了。。。

  • 显示12版本 dynamic symbols

    $ nm -D /lib/x86_64-linux-gnu/libpng12.so.0|grep png_set_longjmp_fn

  • 显示16版本 dynamic symbols

    $ nm -D /usr/lib/x86_64-linux-gnu/libpng.so|grep png_set_longjmp_fn
    结果:000000000000a840 T png_set_longjmp_fn

所以,解决方法很简单,删除旧的库文件,替换成新的。不过最后我发现了一个奇怪的问题,那就是在从 /lib/x86_64-linux-gnu 路径去除libpng12.so.0这个旧版本的库时,virtualbox虚拟机启动显示 创建COM对象失败 。最后重新编译安装了libpng12.so.0并复制到 /lib/x86_64-linux-gnu 目录下才可以!

cp /usr/lib/x86_64-linux-gnu/libpng16.so.16.34.0 /lib/x86_64-linux-gnu/
ln -s /lib/x86_64-linux-gnu/libpng16.so.16.34.0 /lib/x86_64-linux-gnu/libpng16.so #添加软链接

之后重新编译 SDL2_image

./configure
make
make install

SDL_mixer

通过 ./configure --help 查看配置选项。要想支持播放MP3格式,只需添加以下配置参数

./configure –enable-music-mp3enable-music-mp3-mad-gpl
make
make insatll

ldd build/.libs/libSDL2_mixer.so

1
2
3
4
5
6
7
8
9
linux-vdso.so.1 (0x00007ffc71f8d000)
libSDL2-2.0.so.0 => /usr/local/lib/libSDL2-2.0.so.0 (0x00007f07ed821000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f07ed5f2000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f07ed3d4000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f07ed1cc000)
libmad.so.0 => /usr/lib/x86_64-linux-gnu/libmad.so.0 (0x00007f07ecfac000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f07ecc99000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f07ec8f4000)
/lib64/ld-linux-x86-64.so.2 (0x0000557697c43000)

这样就OK了 😃


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!