Вырезание зависимостей

0

Я пишу небольшую игру в 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) 
  • 0
    Пока вы зависите от разделяемых библиотек, все притягивается, что выглядит как зависимость. Вы можете избежать статического связывания, поскольку оно поддерживается вашими импортированными библиотеками.
Теги:
sdl
sdl-2
sdl-mixer

1 ответ

2
Лучший ответ
  1. Если вы собираетесь распространять игру как двоичное изображение (а не источник), используйте статическую ссылку вместо динамической компоновки. После того, как вы включите этот переключатель, нужно динамически связать только несколько библиотек, включая linux-vdso и libc. Обратите внимание, что статическая привязка также упрощает дистрибуцию, так как вы можете избежать версии linux для DLL.

  2. Переход к статическому, вероятно, приведет к взрыву размера вашего двоичного файла, что может быть проблемой. Если это так, я рекомендую скомпилировать каждый пакет из исходного кода самостоятельно, потому что тогда вы сможете отключить дополнительные функции, которые вам не нужны, тем самым уменьшая количество зависимостей, которые у вас есть, и, следовательно, уменьшая размер результирующего статически связанного двоичного кода,

  3. Если вы не получите требуемое сокращение с предыдущего шага, вы также можете изменить источник библиотек, в которых вы находитесь, для удаления ненужного кода. Этот шаг занимает больше времени, чем 2, поэтому только при необходимости.

  • 0
    Почему-то я никогда не видел ваш ответ раньше! Благодарю. Я закончил делать номер 2, то есть самостоятельно компилировать SDL2 и SDL2_mixer и отключать все функции, которые я не использовал.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню