LINUX.ORG.RU

разгрузка списка зависимостей


0

2

Ставлю что-либо в debian - сразу ставится куча библиотек, с которыми было скомпилировано приложение. Но которые (libavahi и прочие libsystemd) не нужны мне, а засоряют систему. Альтернатива - gentoo.

Но вот, например, firefox умеет плагины, которые вполне себе shared library, только загружаемые по ходу исполнения.

И делается это вместо обычной линковки тривиально.

Почему даже крупные проекты, которые умеют зависеть от многих библиотек, не используют подгрузку только нужных библиотек по ходу исполнения? Есть, например, в системе libavahi - подгрузим его, нет - ну и ладно, а для себя отметим, что avahi недоступен и не станем его пытаться использовать.

★★★★★

И делается это вместо обычной линковки тривиально.

Ну-ну. Совсем там всё не тривиально, вместо #ifdef в коде будут операторы if(). Для компиляции будут требоваться хидеры всех библиотек, а в структурах будут лишние поля.

P.S. А вобще тема для Talks, а не для General.

mky ★★★★★
()
Ответ на: комментарий от RedEyedMan3

Да... тяжко владельцам жестких дисков с 40 ГБ.

Ты еще хромбук не видел

snaf ★★★★★
()
Ответ на: комментарий от RedEyedMan3

Места то хватает, но вот при каждом обновлении появляется простыня из библиотек, значительная часть из которых на самом деле не используется. А удалить их нельзя, так как они в зависимостях у чего-то нужного. А каждая библиотека это во-первых, потенциальная уязвимость, а во-вторых, замусоривает список обновляемых пакетов.

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

простыня из библиотек

В Дебиане пакеты раздроблены, отсюда и заблуждения.

Глянь выхлоп aptitude show <пакет> или apt-cache depends <пакет>

Лично не замечал такого.

RedEyedMan3
()
Ответ на: комментарий от RedEyedMan3

раздроблены-не раздроблены, а вот обилие всяких libpulse*, libavahi*, libsystemd*, при том, что я ничем из них не пользуюсь, огорчает.

cvs-255 ★★★★★
() автор топика
if (lib1_exist && lib2_exist && lib3_exist && lib4_exist) {
    do_things1();
}
if (!lib1_exist && lib2_exist && lib3_exist && lib4_exist) {
    do_things2();
}
if (lib1_exist && !lib2_exist && lib3_exist && lib4_exist) {
    do_things3();
}
if (!lib1_exist && !lib2_exist && lib3_exist && lib4_exist) {
    do_things4();
}
if (lib1_exist && lib2_exist && !lib3_exist && lib4_exist) {
    do_things5();
}
if (!lib1_exist && lib2_exist && !lib3_exist && lib4_exist) {
    do_things6();
}
if (lib1_exist && !lib2_exist && !lib3_exist && lib4_exist) {
    do_things7();
}
if (!lib1_exist && !lib2_exist && !lib3_exist && lib4_exist) {
    do_things8();
}
if (lib1_exist && lib2_exist && lib3_exist && !lib4_exist) {
    do_things9();
}
if (!lib1_exist && lib2_exist && lib3_exist && !lib4_exist) {
    do_things10();
}
if (lib1_exist && !lib2_exist && lib3_exist && !lib4_exist) {
    // УМВР, ЛОЛ
}
if (!lib1_exist && !lib2_exist && lib3_exist && !lib4_exist) {
    do_things12();
}
if (lib1_exist && lib2_exist && !lib3_exist && !lib4_exist) {
    do_things13();
}
if (!lib1_exist && lib2_exist && !lib3_exist && !lib4_exist) {
    do_things14();
}
if (lib1_exist && !lib2_exist && !lib3_exist && !lib4_exist) {
    do_things15();
}
if (!lib1_exist && !lib2_exist && !lib3_exist && !lib4_exist) {
    do_things16();
}
i-rinat ★★★★★
()

Открыл браузер, зашёл на страницу, а там нет текста. Всё банально — в системе не оказалось библиотек для рисования шрифтов.

Играл в игрушку, всё было хорошо, как вдруг что-то подстрелило тебя. В системе не оказалось библиотеки для распаковки PNG, а спрайт противника был именно в этом формате.

Программа не запускается совсем, никаких ошибок не пишет. Чтобы понять, что ей нужно, ты запускаешь её в отладчике. Но и там она завершается нормально. После получаса раздумий запускаешь её под strace и, внимательно рассматривая вывод, замечаешь, что среди тонн неудавшихся чтений библиотек из разных мест есть одна, которую не удалось прочитать нигде. Крепко выражаешься, лезешь скачивать библиотеку. Квест повторяется.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

Программа не запускается совсем, никаких ошибок не пишет.

Как плохо. Это тоже тривиально решается

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

Это тоже тривиально решается

Да? Ну тогда вперёд, покажи на своём примере, как это здорово — писать программы с динамическим определением зависимостей. Может пример покажет мне (и не только мне), что это не так уж и дико.

i-rinat ★★★★★
()
Ответ на: комментарий от cvs-255

а вот обилие всяких libpulse*, libavahi*, libsystemd*, при том, что я ничем из них не пользуюсь, огорчает.

Ты опять ничего не понял. Эти все lib* на самом деле созданы из одного source tarbail, а это значит что они всё-таки используются.

RedEyedMan3
()
Ответ на: комментарий от NeXTSTEP

В цивилизованном обществе за предложение собрать ядро бьют по морде.

У тебя неправильное общество.

RedEyedMan3
()
Ответ на: комментарий от RedEyedMan3

Нет. Они не используются, просто висят зависимостями. Потому что приложения с ними слинкованы на случай, если они будут использоваться.

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

Нет. Они не используются, просто висят зависимостями.

Ты правда считаешь мейнтейнеров дебилами, добавляющими «неиспользуемые зависимости»?

Тебе стоит начать изучение пакетной системы Дебиана, чтобы больше не нести тупняк.

RedEyedMan3
()
Ответ на: комментарий от RedEyedMan3
$ dpkg -p mplayer

.....


Depends: ... libjack-jackd2-0, ... libdirectfb-1.2-9, ...  libpulse0 

И весь этот хлам валяется в системе и засоряет список обновляемых пакетов, из-за чего его труднее просматривать.

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от capral

Тогда он найдет другую причину для нытья. Например, почему пакеты такие большие и несут в себе неиспользуемые .so или отладочные символы.

RedEyedMan3
()
Ответ на: комментарий от cvs-255

Это не хлам. Это и есть зависимости. Если не веришь, изучи сорцы твоего mplayer. Он имеет в зависимостях jack, directfb и pulse т.к. это они расширяют его функциональность. Если всего три пакета отравляют тебе жизнь, то стоит перейти на другой дистрибутив, например на генту.

RedEyedMan3
()
Ответ на: комментарий от RedEyedMan3

На генте вполне можно выпилить всё что «не нужно» индивидууму, а потом удивляться, почему пакет валится с ошибкой или вообще не собирается.

RedEyedMan3
()
Ответ на: комментарий от RedEyedMan3

Ты хоть ОП прочитал?

Даже большие проекты вместо того, чтобы подгружать библиотеки на лету, что реализуется тривиально, используют обычную линковку на стадии запуска.

cvs-255 ★★★★★
() автор топика

Почему даже крупные проекты, которые умеют зависеть от многих библиотек, не используют подгрузку только нужных библиотек по ходу исполнения?

Видимо на это есть свои причины. Если тебя волнует этот вопрос, займись им. Мне к примеру это до лампочки.

RedEyedMan3
()
Ответ на: комментарий от RedEyedMan3

Ты правда считаешь мейнтейнеров дебилами, добавляющими «неиспользуемые зависимости»?

В дебиане есть нюанс : при установке cheese ты получаешь в подарок brasero. Ну вот и зачем он мне если у меня уже установлен k3b ?

snaf ★★★★★
()
Ответ на: комментарий от cvs-255

Потому что это не настолько тривиально насколько кажется. Это очень здорово усложнит логику приложения плюс создаст чёртову уйму маловразумительных ошибок времени исполнения.

KblCb ★★★★★
()
Ответ на: комментарий от RedEyedMan3

Я уже посоветовал, куда тебе нужно сваливать.

В vim и gcc для переписывания исходников используемых программ?

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от snaf
$ aptitude show cheese
Package: cheese                          
New: yes
State: not installed
Version: 3.10.1-1sid1
Priority: optional
Section: gnome
Maintainer: Debian GNOME Maintainers <pkg-gnome-maintainers@lists.alioth.debian.org>
Architecture: amd64
Uncompressed Size: 430 k
Depends: libc6 (>= 2.3.4), libcanberra-gtk3-0 (>= 0.25), libcheese-gtk23 (>= 3.4.0), libcheese7 (>= 3.5.1),
         libclutter-1.0-0 (>= 1.13.2), libclutter-gtk-1.0-0 (>= 0.91.8), libgdk-pixbuf2.0-0 (>= 2.22.0), libglib2.0-0
         (>= 2.35.9), libgnome-desktop-3-7 (>= 3.2.0), libgstreamer1.0-0 (>= 1.0.0), libgtk-3-0 (>= 3.4.4),
         cheese-common (= 3.10.1-1sid1), gnome-video-effects

$ sudo aptitude install cheese -R
The following NEW packages will be installed:
  cheese cheese-common{a} gnome-desktop3-data{a} gnome-video-effects{a} gstreamer1.0-clutter{a} 
  gstreamer1.0-plugins-bad{a} gstreamer1.0-plugins-base{a} gstreamer1.0-plugins-good{a} gstreamer1.0-x{a} 
  libcanberra-gtk3-0{a} libcheese-gtk23{a} libcheese7{a} libclutter-1.0-0{a} libclutter-gst-2.0-0{a} 
  libclutter-gtk-1.0-0{a} libcogl-pango12{a} libcogl12{a} libgles2-mesa{a} libgnome-desktop-3-7{a} 
  libgstreamer-plugins-bad1.0-0{a} libgtkglext1{a} libopencv-calib3d2.4{a} libopencv-contrib2.4{a} 
  libopencv-core2.4{a} libopencv-features2d2.4{a} libopencv-flann2.4{a} libopencv-highgui2.4{a} 
  libopencv-imgproc2.4{a} libopencv-legacy2.4{a} libopencv-ml2.4{a} libopencv-objdetect2.4{a} 
  libopencv-video2.4{a} libsbc1{a} libsrtp0{a} libtbb2{a} 
The following packages are RECOMMENDED but will NOT be installed:
  hwdata libcanberra-gtk3-module libclutter-1.0-common libcogl-common nautilus-sendto yelp

Где?

leave ★★★★★
()
Ответ на: комментарий от KblCb

Я сам проверял, что это достаточно просто.

1) определяем путь до библиотеки

2) загружаем ее

3) импортируем используемые функции

4) отмечаем, что теперь мы можем использовать эти функции.

Все это реализуется без особых трудностей.

cvs-255 ★★★★★
() автор топика
Последнее исправление: cvs-255 (всего исправлений: 1)
Ответ на: комментарий от snaf

В дебиане есть нюанс : при установке cheese ты получаешь в подарок brasero.

Враньё!

sdio ★★★★★
()
Ответ на: комментарий от snaf

В дебиане есть нюанс : при установке cheese ты получаешь в подарок brasero.

galym@wheezygalym:~$ sudo apt-get install cheese
[sudo] password for galym: 
Чтение списков пакетов… Готово
Построение дерева зависимостей       
Чтение информации о состоянии… Готово
Будут установлены следующие дополнительные пакеты:
  brasero brasero-common cheese-common evolution-data-server-common gir1.2-clutter-1.0 gir1.2-clutter-gst-1.0 gir1.2-cogl-1.0 gir1.2-coglpango-1.0 gir1.2-evince-3.0
  gir1.2-gst-plugins-base-0.10 gir1.2-gstreamer-0.10 gir1.2-gtkclutter-1.0 gir1.2-gtksource-3.0 gir1.2-json-1.0 gnome-desktop3-data gnome-sushi gnome-user-guide
  gnome-video-effects gstreamer0.10-plugins-ugly gvfs-backends libbrasero-media3-1 libburn4 libcamel-1.2-33 libcheese-gtk21 libcheese3 libclutter-1.0-0
  libclutter-1.0-common libclutter-gst-1.0-0 libclutter-gtk-1.0-0 libclutter-imcontext-0.1-0 libclutter-imcontext-0.1-bin libcluttergesture-0.0.2-0 libcogl-common
  libcogl-pango0 libcogl9 libebook-1.2-13 libecal-1.2-11 libedataserver-1.2-16 libedataserverui-3.0-1 libevdocument3-4 libevview3-3 libexempi3 libgee2 libgjs0b
  libgmime-2.6-0 libgnome-desktop-3-2 libgssdp-1.0-3 libgtksourceview-3.0-0 libgtksourceview-3.0-common libgupnp-1.0-4 libgxps2 libisofs6 libjson-glib-1.0-0 libjte1
  libmozjs185-1.0 libmusicbrainz5-0 libmx-1.0-2 libmx-bin libmx-common libquvi-scripts libquvi7 libsidplay1 libt1-5 libtotem-plparser17 libtracker-sparql-0.14-0 libyelp0
  nautilus nautilus-data nautilus-sendto yelp yelp-xsl
Предлагаемые пакеты:
  libdvdcss2 tracker gnome-video-effects-frei0r obex-data-server sidplay-base xsidplay eog xdg-user-dirs pidgin gajim                                                       
НОВЫЕ пакеты, которые будут установлены:                                                                                                                                    
  brasero brasero-common cheese cheese-common evolution-data-server-common gir1.2-clutter-1.0 gir1.2-clutter-gst-1.0 gir1.2-cogl-1.0 gir1.2-coglpango-1.0                   
  gir1.2-evince-3.0 gir1.2-gst-plugins-base-0.10 gir1.2-gstreamer-0.10 gir1.2-gtkclutter-1.0 gir1.2-gtksource-3.0 gir1.2-json-1.0 gnome-desktop3-data gnome-sushi           
  gnome-user-guide gnome-video-effects gstreamer0.10-plugins-ugly gvfs-backends libbrasero-media3-1 libburn4 libcamel-1.2-33 libcheese-gtk21 libcheese3 libclutter-1.0-0    
  libclutter-1.0-common libclutter-gst-1.0-0 libclutter-gtk-1.0-0 libclutter-imcontext-0.1-0 libclutter-imcontext-0.1-bin libcluttergesture-0.0.2-0 libcogl-common          
  libcogl-pango0 libcogl9 libebook-1.2-13 libecal-1.2-11 libedataserver-1.2-16 libedataserverui-3.0-1 libevdocument3-4 libevview3-3 libexempi3 libgee2 libgjs0b             
  libgmime-2.6-0 libgnome-desktop-3-2 libgssdp-1.0-3 libgtksourceview-3.0-0 libgtksourceview-3.0-common libgupnp-1.0-4 libgxps2 libisofs6 libjson-glib-1.0-0 libjte1        
  libmozjs185-1.0 libmusicbrainz5-0 libmx-1.0-2 libmx-bin libmx-common libquvi-scripts libquvi7 libsidplay1 libt1-5 libtotem-plparser17 libtracker-sparql-0.14-0 libyelp0   
  nautilus nautilus-data nautilus-sendto yelp yelp-xsl                                                                                                                      
обновлено 0, установлено 72 новых пакетов, для удаления отмечено 0 пакетов, и 12 пакетов не обновлено.
Необходимо скачать 36,8 MБ архивов.
После данной операции, объём занятого дискового пространства возрастёт на 120 MB.
Хотите продолжить [Д/н]? 
galym@wheezygalym:~$ sudo apt-get install cheese  --no-install-recommends
Чтение списков пакетов… Готово
Построение дерева зависимостей       
Чтение информации о состоянии… Готово
Будут установлены следующие дополнительные пакеты:
  cheese-common gnome-desktop3-data gnome-video-effects libcheese-gtk21 libcheese3 libclutter-1.0-0 libclutter-gst-1.0-0 libclutter-gtk-1.0-0 libclutter-imcontext-0.1-0
  libcluttergesture-0.0.2-0 libcogl-pango0 libcogl9 libgee2 libgnome-desktop-3-2 libjson-glib-1.0-0 libmx-1.0-2 libmx-common
Предлагаемые пакеты:
  gnome-video-effects-frei0r
Рекомендуемые пакеты:
  nautilus-sendto yelp libclutter-1.0-common libclutter-imcontext-0.1-bin libcogl-common libmx-bin
НОВЫЕ пакеты, которые будут установлены:
  cheese cheese-common gnome-desktop3-data gnome-video-effects libcheese-gtk21 libcheese3 libclutter-1.0-0 libclutter-gst-1.0-0 libclutter-gtk-1.0-0
  libclutter-imcontext-0.1-0 libcluttergesture-0.0.2-0 libcogl-pango0 libcogl9 libgee2 libgnome-desktop-3-2 libjson-glib-1.0-0 libmx-1.0-2 libmx-common
обновлено 0, установлено 18 новых пакетов, для удаления отмечено 0 пакетов, и 12 пакетов не обновлено.
Необходимо скачать 6 995 kБ архивов.
После данной операции, объём занятого дискового пространства возрастёт на 16,0 MB.
Хотите продолжить [Д/н]? 

RedEyedMan3
()
Ответ на: комментарий от RedEyedMan3

это несложно, но этого очень много.

Но в своих программах, там где какая-то библиотека используется опционально, я так и поступаю.

cvs-255 ★★★★★
() автор топика
Ответ на: комментарий от cvs-255

Сложность не в том чтобы экспортировать функции. Сложность в том что тебе предётся держать глобальную таблицу символов и на каждый чих сверяться с этой таблицей. А заодно и обрабатывать ситуации когда одной или нескольких функций нет. Кроме того если ты захочешь прилинковать библиотеку статически — жизнь твоя станет адом. Кроме того путь к библиотеке придётся либо зашивать в код, либо пихать в конфиг что очень порадует дистростроителей.

KblCb ★★★★★
()
Ответ на: комментарий от KblCb

Сложность в том что тебе предётся держать глобальную таблицу символов и на каждый чих сверяться с этой таблицей.

Нет. Это совсем несложно. Просто создается много указателей на функции. Это, к тому же, можно автоматизировать.

А заодно и обрабатывать ситуации когда одной или нескольких функций нет

Писать «нет функции». Как это и происходит при обычной линковке, если не находит функцию.

Кроме того путь к библиотеке придётся либо зашивать в код, либо пихать в конфиг

либо включить голову, и искать библиотеку так, как это делает обычный линковщик.

cvs-255 ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.