Чи добре (чи ні) символізувати бібліотеки для подолання помилок "не можна відкрити спільний об'єкт"?


12

Іноді з тієї чи іншої причини програма не вказала або не включила всі свої залежності правильно, і запуск її призводить до помилок, що вказують на відсутні залежності. Типова помилка - це щось на кшталт:

cannot open shared object libudev.so.0

Я бачу багато відповідей, які рекомендують людям /usr/libвирішувати подібні проблеми, створюючи посилання в інших місцях системи, і це, здається, часто вирішує проблему. Але я бачу рівну кількість коментарів, які вказують людям, що це погана ідея. Ось одна відповідь, яка є репрезентативною.

За яких обставин допустимо символізувати бібліотеку, щоб програма працювала? Ніколи? Іноді? Що робити, якщо ви видалите символьне посилання після закінчення запуску програми?

Які наслідки цього робити?

Відповіді:


12

Проблема при створенні цих посилань полягає в тому, що ними не керують жодним змістовним чином. Якщо цю бібліотеку видалити, посилання стає розірваною. Якщо бібліотеку оновлено, може виникнути помилка через посилання, яке вона не очікує, що вона буде там.

Крім того, ви по суті брешите до системи. У пов'язаному прикладі ви робите вигляд, що libudev.so.1це насправді libudev.so.0. Вони названі по-різному з причини (різні версії бібліотеки). Хоча це може спрацювати добре для деяких програм, є ймовірність, що різниці між версіями можуть спричинити проблеми (наприклад, сегментація або інша несподівана поведінка).

Отже, якщо ви спеціально створюєте це посилання просто для того, щоб програма запустилася, і ви знаєте, що ви її видалите пізніше, ви звертаєтесь до першого питання, а не до другого. Хоча це вирішує основну проблему, це не ідеально.

Ідеальним рішенням є звичайно встановити правильну версію бібліотеки (прийнята відповідь на вашому зв'язаному прикладі) або скласти програму проти вашої версії.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.