Можно ли (или нет) использовать библиотеки ссылок для преодоления ошибок «не удается открыть общий объект»?

12

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

cannot open shared object libudev.so.0

Я вижу много ответов, советующих людям обходить такие проблемы, создавая символические ссылки в /usr/libдругих местах системы, и, похоже, это часто решает проблему. Но я вижу такое же количество комментариев, которые советуют людям, что это плохая идея. Вот один ответ, который является представительным.

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

Каковы последствия этого?

Джон Феминелла
источник

Ответы:

12

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

Кроме того, вы по сути лжете в систему. В связанном примере вы притворяетесь, что libudev.so.1на самом деле libudev.so.0. Они названы по-разному по причине (разные версии библиотеки). Хотя для некоторых программ это может работать очень хорошо, существует вероятность того, что различия между версиями могут вызвать проблемы (например, segfault или другое непредвиденное поведение).

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

Идеальным решением, конечно же, является установка правильной версии библиотеки (принятый ответ в вашем связанном примере) или компиляция программы в соответствии с имеющейся у вас версией.

Nattgew
источник