Вопрос или проблема
У меня на системе есть несколько сборок приложения (разработческая сборка и много старых выпущенных сборок). Когда я пытаюсь запустить старую версию, система неизменно выбирает динамические библиотеки из разработческой сборки.
Из /home/franz/Projects/appleseed/archives/releases/1.1.0-alpha-14-0-g4e46ed9/appleseed/bin
, который является каталогом старой версии, которую я пытаюсь запустить:
$ ldd appleseed.studio
[некоторые данные опущены]
libappleseed.so => /home/franz/Projects/appleseed/build/linux-gcc4/appleseed/libappleseed.so (0x00007fbcb090b000)
libappleseed.shared.so => /home/franz/Projects/appleseed/build/linux-gcc4/appleseed.shared/libappleseed.shared.so (0x00007fbcb030c000)
[больше данных опущено]
(/home/franz/Projects/appleseed/build/linux-gcc4/appleseed/
— это путь к моей разработческой сборке.)
Естественно, я должен правильно установить LD_LIBRARY_PATH
перед запуском старой версии:
$ export LD_LIBRARY_PATH=/home/franz/Projects/appleseed/archives/releases/1.1.0-alpha-14-0-g4e46ed9/appleseed/bin ; ./appleseed.studio
(LD_LIBRARY_PATH
изначально пуст, поэтому я не беспокоюсь о конкатенации.)
Однако это не работает, и система продолжает брать библиотеки разработческой сборки.
Я делаю что-то не так? Есть идеи?
Я запускаю 64-битную сборку Ubuntu 10.10 Maverick Meerkat (поддержка прекращена с апреля 2012 года).
ОБНОВЛЕНИЕ: Я обновил свою систему до Ubuntu 11.10 (Natty), и проблема сохраняется.
-
Убедитесь, что в
/home/franz/Projects/appleseed/archives/releases/1.1.0-alpha-14-0-g4e46ed9/appleseed/bin
действительно находятся те совместимые библиотеки, которые вы хотите загрузить. Они действительно в каталоге
bin/
архива? А не вlib/
? -
Попробуйте
/lib/ld-linux.so.2 --library-path /home/franz/Projects/appleseed/archives/releases/1.1.0-alpha-14-0-g4e46ed9/appleseed/bin ./appleseed.studio
Вы можете использовать параметры этой программы для управления и отладки процесса загрузки библиотек.
Для 64-битной версии /usr/bin/ld -> x86_64-linux-gnu-ld является загрузчиком, а не 32-битная /lib/ld-linux.so.2 -> i386-linux-gnu/ld-2.27.so. Для этого не нужен 32-битный загрузчик.
Команда ldd указывает, что совместимые библиотеки, которые она использует, находятся в …/appleseed и …/appleseed.shared. Добавление нового места для необходимых библиотек (в …/bin) не изменит этого и не загрузит библиотеки из …/bin. Оставшийся вопрос заключается в том, как ldd находит эти библиотеки, если они не находятся в стандартном местоположении и не в LD_LIBRARY_PATH. Я бы проверил, как был связан исполняемый файл; возможно, вы указали полный путь к необходимым библиотекам и не полагались только на имя, нуждаясь в наборе мест для сканирования, который предоставлял бы LD_LIBRARY_PATH.
Ответ или решение
Для решения проблемы с загрузкой динамических библиотек при запуске приложения в Linux, следует учитывать несколько ключевых моментов. Рассмотрим пошагово, что можно сделать в вашей ситуации:
-
Проверка наличия библиотек: Убедитесь, что необходимые вам динамические библиотеки действительно находятся в указанном каталоге
/home/franz/Projects/appleseed/archives/releases/1.1.0-alpha-14-0-g4e46ed9/appleseed/bin
. Возможно, они находятся в другом каталоге (например, вlib/
). Проверьте это с помощью командыls
. -
Используйте правильный загрузчик библиотек: Для 64-разрядной версии вашей системы загрузчик будет находиться в
/lib64
или/usr/lib/x86_64-linux-gnu
. Попробуйте запускать ваше приложение с использованием загрузчика напрямую. Например, выполните следующую команду:/lib64/ld-linux-x86-64.so.2 --library-path /home/franz/Projects/appleseed/archives/releases/1.1.0-alpha-14-0-g4e46ed9/appleseed/bin ./appleseed.studio
Убедитесь, что указанный путь к загрузчику (
ld-linux-x86-64.so.2
) соответствует вашему окружению. -
Проверка статической линковки: Выполните команду
ldd ./appleseed.studio
, чтобы понять, какие именно библиотеки загружаются, и откуда они берутся. Обратите внимание на вывод — если библиотеки загружаются из вашего dev build, возможно, эти библиотеки были связаны статически, что делаетLD_LIBRARY_PATH
неэффективным. -
Файл конфигурации: Возможно, ваше приложение ссылается на библиотеки, которые указаны при компиляции в самом исполняемом файле. В этом случае можно использовать утилиту
readelf
с флагом-d
для просмотра динамических секций и аргументов линковщика:readelf -d ./appleseed.studio | grep NEEDED
-
Проверка переменной окружения: Убедитесь, что переменная
LD_LIBRARY_PATH
действительно установлена. Проверьте её значение с помощью команды:echo $LD_LIBRARY_PATH
-
Деинсталляция и переустановка: Если ничего не помогает, рассмотрите возможность деинсталляции вашего dev build, чтобы гарантировать, что он не мешает запуску старой версии приложения. После этого попробуйте снова.
Следуя этим шагам, вы сможете лучше диагностировать и, возможно, устранить проблему с загрузкой динамических библиотек в вашем приложении. Если у вас остались вопросы, не стесняйтесь задавать их.