Хотя в репозиториях современных дистрибутивов есть огромное количество готовых бинарных пакетов приложений на любой вкус, обязательно найдется такое, установить которое в систему иначе как собрав из исходников не удастся.
Нередко запуск таких приложений заканчивается крахом и сопровождается сообщениями об отсутствии некоторых библиотек, хотя на самом деле такие библиотеки есть в системе. Обычно причина этому — несовпадение версии библиотеки.
Несовпадение версии библиотеки
Любимый многими проигрыватель Bomi, чья разработка в последнее время несколько забуксовала и не поспевает за обновлениями используемых библиотек, после установки из исходников может ругаться на отсутствие библиотеки libass.so.5:
1 |
[crayon-6707aec41c8aa027027506 inline="true" ]<span class="pln">bomi</span><span class="pun">:</span><span class="pln"> error </span><span class="kwd">while</span><span class="pln"> loading shared libraries</span><span class="pun">:</span><span class="pln"> libass</span><span class="pun">.</span><span class="pln">so</span><span class="pun">.</span><span class="lit">5</span><span class="pun">:</span><span class="pln"> cannot open shared </span><span class="kwd">object</span><span class="pln"> file</span><span class="pun">:</span> <span class="typ">No</span><span class="pln"> such file </span><span class="kwd">or</span><span class="pln"> directory</span> |
[/crayon]
Первая мысль: установить эту библиотеку. Устанавливаем и получаем то же сообщение, потому что версии библиотек не совпадают: у нас 9.0.1, а нужна 5.
В этом случае можно попытаться обмануть Bomi, подсунув ему нашу версию библиотеки под видом нужной ему. Сделать это можно с помощью символической ссылки:
1 2 |
[crayon-6707aec41c8ac139951299 inline="true" ]<span class="pln">$ cd </span><span class="pun">/</span><span class="pln">usr</span><span class="pun">/</span><span class="pln">lib $ sudo ln </span><span class="pun">-</span><span class="pln">s libass</span><span class="pun">.</span><span class="pln">so</span><span class="pun">.</span><span class="lit">9.0</span><span class="pun">.</span><span class="lit">1</span><span class="pln"> libass</span><span class="pun">.</span><span class="pln">so</span><span class="pun">.</span><span class="lit">5</span> |
[/crayon]
Потерей библиотек грешат даже приложения, находящиеся в официальных репозиториях. Так что знать, как это исправить, не помешает и законопослушным пользователям.
Конфликты библиотек
Противоположная ситуация складывается, когда пакетный менеджер ругается не на отсутствие, а на присутствие в системе той же библиотеки, что поставляется с устанавливаемым пакетом.
Причиной может быть другое установленное приложение, уже предоставившее данную библиотеку. Так часто случается, когда пакет установлен с помощью инструмента, отличного от штатного пакетного менеджера, например питоновского pip.
Проблемы могут быть и между пакетами, установленными из стандартного менеджера пакетов. Например, установка nvidia-340xx-utils в Manjaro Linux до внесения разработчиками исправлений могла завершиться целой чередой сообщений о наличии содержащихся в нем библиотек в системе, по недоразумению установленных в систему пакетом libglvnd:
1 2 3 4 5 6 7 8 |
[crayon-6707aec41c8b0112372629 inline="true" ]<span class="pln">nvidia</span><span class="pun">-</span><span class="lit">340xx</span><span class="pun">-</span><span class="pln">utils</span><span class="pun">:</span> <span class="str">'/usr/lib/nvidia/libEGL.so'</span> <span class="pun">существует</span> <span class="pun">в</span> <span class="pun">файловой</span> <span class="pun">системе</span><span class="pln"> nvidia</span><span class="pun">-</span><span class="lit">340xx</span><span class="pun">-</span><span class="pln">utils</span><span class="pun">:</span> <span class="str">'/usr/lib/nvidia/libEGL.so.1'</span> <span class="pun">существует</span> <span class="pun">в</span> <span class="pun">файловой</span> <span class="pun">системе</span><span class="pln"> nvidia</span><span class="pun">-</span><span class="lit">340xx</span><span class="pun">-</span><span class="pln">utils</span><span class="pun">:</span> <span class="str">'/usr/lib/nvidia/libGL.so'</span> <span class="pun">существует</span> <span class="pun">в</span> <span class="pun">файловой</span> <span class="pun">системе</span><span class="pln"> nvidia</span><span class="pun">-</span><span class="lit">340xx</span><span class="pun">-</span><span class="pln">utils</span><span class="pun">:</span> <span class="str">'/usr/lib/nvidia/libGL.so.1'</span> <span class="pun">существует</span> <span class="pun">в</span> <span class="pun">файловой</span> <span class="pun">системе</span><span class="pln"> nvidia</span><span class="pun">-</span><span class="lit">340xx</span><span class="pun">-</span><span class="pln">utils</span><span class="pun">:</span> <span class="str">'/usr/lib/nvidia/libGLESv1_CM.so'</span> <span class="pun">существует</span> <span class="pun">в</span> <span class="pun">файловой</span> <span class="pun">системе</span><span class="pln"> nvidia</span><span class="pun">-</span><span class="lit">340xx</span><span class="pun">-</span><span class="pln">utils</span><span class="pun">:</span> <span class="str">'/usr/lib/nvidia/libGLESv1_CM.so.1'</span> <span class="pun">существует</span> <span class="pun">в</span> <span class="pun">файловой</span> <span class="pun">системе</span><span class="pln"> nvidia</span><span class="pun">-</span><span class="lit">340xx</span><span class="pun">-</span><span class="pln">utils</span><span class="pun">:</span> <span class="str">'/usr/lib/nvidia/libGLESv2.so'</span> <span class="pun">существует</span> <span class="pun">в</span> <span class="pun">файловой</span> <span class="pun">системе</span><span class="pln"> nvidia</span><span class="pun">-</span><span class="lit">340xx</span><span class="pun">-</span><span class="pln">utils</span><span class="pun">:</span> <span class="str">'/usr/lib/nvidia/libGLESv2.so.2'</span> <span class="pun">существует</span> <span class="pun">в</span> <span class="pun">файловой</span> <span class="pun">системе</span> |
[/crayon]
В подобных случаях сначала придется деинсталлировать пакет, вызвавший ошибку, а затем установить требуемый.
Иногда, например все для того же pip или если приложение вообще было установлено способом configure && make && make install, потребуется вручную удалять библиотеки, вызвавшие конфликт, не деинсталлируя само приложение, их породившее.
Проблемы доступа к устройствам
Досадно обнаружить, как установленное тобой приложение, работающее с периферийными устройствами, вдруг «радует» сообщением, что нет прав на доступ к этим устройствам, и успешно запускается только с правами суперпользователя. Например, если бы подобное произошло с tvtime в отношении видеокарты, пользователь столкнулся бы с таким сообщением в консоли:
1 |
[crayon-6707aec41c8b2262686512 inline="true" ]<span class="pln">videoinput</span><span class="pun">:</span> <span class="typ">Cannot</span><span class="pln"> open capture device </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">video0</span><span class="pun">:</span> <span class="typ">Permission</span><span class="pln"> denied</span> |
[/crayon]
Первым делом следует проверить группы доступа к устройству:
1 |
[crayon-6707aec41c8b4179370304 inline="true" ]<span class="pln">$ ls </span><span class="pun">-</span><span class="pln">l </span><span class="pun">/</span><span class="pln">dev</span><span class="pun">/</span><span class="pln">video0</span> |
[/crayon]
Ожидаемо ты обнаруживаешь среди них root и video, но не обнаруживаешь в последней себя (user), выполнив проверку командой
1 |
[crayon-6707aec41c8b6832667430 inline="true" ]<span class="pln">$ groups</span> |
[/crayon]
Естественное решение — добавить пользователя (user) в группу (video) любой из доступных команд:
1 2 3 |
[crayon-6707aec41c8b8724575486 inline="true" ]<span class="pln">$ sudo usermod </span><span class="pun">-</span><span class="pln">a </span><span class="pun">-</span><span class="pln">G video user $ sudo useradd </span><span class="pun">-</span><span class="pln">a </span><span class="pun">-</span><span class="pln">G video user $ sudo gpasswd </span><span class="pun">-</span><span class="pln">a user video</span> |
[/crayon]
По завершении команды нужно перезайти в систему.