Я пишу небольшую игру на C ++ с использованием SDL2 / Box2D / OpenGL (плюс расширения SDL2 SDL2_mixer и SDL2_ttf). Так как я приближаюсь к версии 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)
Если вы собираетесь распространять игру в виде бинарного изображения (а не исходного кода), используйте статическое связывание вместо динамического связывания. Только несколько библиотек должны быть динамически связаны после этого переключения, включая linux-vdso и libc. Обратите внимание, что статическое связывание также упрощает распространение, так как вы можете избежать Linux-версии адской библиотеки DLL.
Переключение на статический режим, вероятно, приведет к увеличению размера вашего двоичного файла, что может быть проблемой. Если это так, я рекомендую компилировать каждый пакет из исходного кода самостоятельно, потому что тогда вы сможете отключить необязательные функции, которые вам не нужны, тем самым еще больше сократив количество зависимостей, которые у вас есть, и, следовательно, уменьшите размер получающегося в результате статически связанного двоичного файла. ,
Если вы не получили нужного вам сокращения с предыдущего шага, вы также можете изменить источник библиотек, от которых вы зависите, чтобы удалить ненужный код. Этот шаг занимает больше времени, чем 2, поэтому делайте это только при необходимости.