削减依赖关系

时间:2014-08-16 16:49:42

标签: c++ linux sdl sdl-2 sdl-mixer

我正在使用SDL2 / Box2D / OpenGL(加上SDL2扩展SDL2_mixer和SDL2_ttf)在C ++中编写一个小游戏。由于我接近1.0版,我一直在考虑分发游戏,我发现我的游戏有一些意想不到的依赖。

显然SDL2正在吸引像libjson这样的依赖关系(为什么SDL需要json?)而SDL2_mixer会拉入libglib。在我看来,这是最奇怪的,但还有更多。例如,SDL2而不是SDL2_mixer正在拉入libFLAC。还有libpng,libmad,libvorbis等依赖项,我确定我没有使用它的功能。

我是否需要包含所有这些依赖项才能拥有一个非常独立的游戏?什么是将依赖数减少到绝对最小的最佳方法?

这是ldd:

的完整输出
linux-vdso.so.1 =>  (0x00007fff19ee0000)
libSDL2-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libSDL2-2.0.so.0 (0x00007f562ede5000)
libSDL2_ttf-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libSDL2_ttf-2.0.so.0 (0x00007f562ebdd000)
libSDL2_mixer-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libSDL2_mixer-2.0.so.0 (0x00007f562e98d000)
libGL.so.1 => /usr/lib/nvidia-304/libGL.so.1 (0x00007f562e670000)
libGLEW.so.1.10 => /usr/lib/x86_64-linux-gnu/libGLEW.so.1.10 (0x00007f562e3e4000)
libSOIL.so.1 => /usr/lib/libSOIL.so.1 (0x00007f562e1cc000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f562dec8000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f562dbc2000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f562d9ab000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f562d5e5000)
libasound.so.2 => /usr/lib/x86_64-linux-gnu/libasound.so.2 (0x00007f562d2f5000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f562d0f0000)
libpulse-simple.so.0 => /usr/lib/x86_64-linux-gnu/libpulse-simple.so.0 (0x00007f562ceec000)
libpulse.so.0 => /usr/lib/x86_64-linux-gnu/libpulse.so.0 (0x00007f562cca3000)
libX11.so.6 => /usr/lib/x86_64-linux-gnu/libX11.so.6 (0x00007f562c96d000)
libXext.so.6 => /usr/lib/x86_64-linux-gnu/libXext.so.6 (0x00007f562c75b000)
libXcursor.so.1 => /usr/lib/x86_64-linux-gnu/libXcursor.so.1 (0x00007f562c551000)
libXinerama.so.1 => /usr/lib/x86_64-linux-gnu/libXinerama.so.1 (0x00007f562c34d000)
libXi.so.6 => /usr/lib/x86_64-linux-gnu/libXi.so.6 (0x00007f562c13d000)
libXrandr.so.2 => /usr/lib/x86_64-linux-gnu/libXrandr.so.2 (0x00007f562bf33000)
libXss.so.1 => /usr/lib/x86_64-linux-gnu/libXss.so.1 (0x00007f562bd2e000)
libXxf86vm.so.1 => /usr/lib/x86_64-linux-gnu/libXxf86vm.so.1 (0x00007f562bb28000)
libwayland-egl.so.1 => /usr/lib/x86_64-linux-gnu/libwayland-egl.so.1 (0x00007f562b926000)
libwayland-client.so.0 => /usr/lib/x86_64-linux-gnu/libwayland-client.so.0 (0x00007f562b718000)
libwayland-cursor.so.0 => /usr/lib/x86_64-linux-gnu/libwayland-cursor.so.0 (0x00007f562b510000)
libxkbcommon.so.0 => /usr/lib/x86_64-linux-gnu/libxkbcommon.so.0 (0x00007f562b2d6000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f562b0b7000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f562aeaf000)
libfreetype.so.6 => /usr/lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f562ac0b000)
libmodplug.so.1 => /usr/lib/libmodplug.so.1 (0x00007f562a93c000)
libfluidsynth.so.1 => /usr/lib/x86_64-linux-gnu/libfluidsynth.so.1 (0x00007f562a666000)
libvorbisfile.so.3 => /usr/lib/x86_64-linux-gnu/libvorbisfile.so.3 (0x00007f562a45e000)
libFLAC.so.8 => /usr/lib/x86_64-linux-gnu/libFLAC.so.8 (0x00007f562a22c000)
libmad.so.0 => /usr/lib/x86_64-linux-gnu/libmad.so.0 (0x00007f562a00d000)
libnvidia-tls.so.304.117 => /usr/lib/nvidia-304/tls/libnvidia-tls.so.304.117 (0x00007f5629e0a000)
libnvidia-glcore.so.304.117 => /usr/lib/nvidia-304/libnvidia-glcore.so.304.117 (0x00007f5627a1f000)
/lib64/ld-linux-x86-64.so.2 (0x00007f562f116000)
libpulsecommon-4.0.so => /usr/lib/x86_64-linux-gnu/pulseaudio/libpulsecommon-4.0.so (0x00007f56277b8000)
libjson-c.so.2 => /lib/x86_64-linux-gnu/libjson-c.so.2 (0x00007f56275ac000)
libdbus-1.so.3 => /lib/x86_64-linux-gnu/libdbus-1.so.3 (0x00007f5627367000)
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f5627148000)
libXrender.so.1 => /usr/lib/x86_64-linux-gnu/libXrender.so.1 (0x00007f5626f3d000)
libXfixes.so.3 => /usr/lib/x86_64-linux-gnu/libXfixes.so.3 (0x00007f5626d37000)
libffi.so.6 => /usr/lib/x86_64-linux-gnu/libffi.so.6 (0x00007f5626b2e000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f5626915000)
libpng12.so.0 => /lib/x86_64-linux-gnu/libpng12.so.0 (0x00007f56266ef000)
libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f56263e6000)
libjack.so.0 => /usr/lib/x86_64-linux-gnu/libjack.so.0 (0x00007f562618d000)
libsndfile.so.1 => /usr/lib/x86_64-linux-gnu/libsndfile.so.1 (0x00007f5625f25000)
libreadline.so.6 => /lib/x86_64-linux-gnu/libreadline.so.6 (0x00007f5625cde000)
libvorbis.so.0 => /usr/lib/x86_64-linux-gnu/libvorbis.so.0 (0x00007f5625ab1000)
libogg.so.0 => /usr/lib/x86_64-linux-gnu/libogg.so.0 (0x00007f56258a8000)
libwrap.so.0 => /lib/x86_64-linux-gnu/libwrap.so.0 (0x00007f562569d000)
libasyncns.so.0 => /usr/lib/x86_64-linux-gnu/libasyncns.so.0 (0x00007f5625497000)
libXau.so.6 => /usr/lib/x86_64-linux-gnu/libXau.so.6 (0x00007f5625292000)
libXdmcp.so.6 => /usr/lib/x86_64-linux-gnu/libXdmcp.so.6 (0x00007f562508c000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f5624e4e000)
libvorbisenc.so.2 => /usr/lib/x86_64-linux-gnu/libvorbisenc.so.2 (0x00007f562497e000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007f5624755000)
libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00007f562453a000)
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f562431f000) 

1 个答案:

答案 0 :(得分:2)

  1. 如果您要将游戏分发为二进制图像(而不是源代码),则使用静态链接而不是动态链接。进行此切换后,只有少数库应该动态链接,包括linux-vdso和libc。请注意,静态链接也使分发更简单,因为你可以避免DLL地狱的linux版本。

  2. 切换到静态可能会破坏二进制文件的大小,这可能是个问题。如果是,我建议您自己编译每个包,因为您可以禁用不需要的可选功能,从而进一步减少您拥有的依赖项数量,从而减少静态结果的大小链接二进制文件。

  3. 如果您没有从上一步获得所需的减少量,您还可以根据删除不必要的代码来修改您所依赖的库的来源。此步骤比2更耗时,因此只在必要时执行此操作。