2013-12-07 3 views
2

Я использую eclipse cdt для компиляции и запуска приложения C++.неправильное имя общей библиотеки, загруженной во время выполнения Ubuntu

My_main_program необходимо конкретно libjpeg.so.62.

Моя система Ubuntu ранее имела libjpeg.so.9 по адресу /usr/local/lib/. Мне пришлось скомпилировать и запустить с использованием libjpeg.so.9 до того, как были исправлены ошибки совместимости во время выполнения.

Затем я удалил все libjpeg. * и установлен libjpeg.la, libjpeg.so, libjpeg.so.62 и libjpeg.so.62.0.0 от источника. Затем я запустил ldconfig.

Я могу построить проект. Проблема в том, динамический компоновщик продолжает поиски libjpeg.so.9 и бросали

'error while loading shared libraries: libjpeg.so.9: cannot open shared object file: No such file or directory'

во время выполнения. Эта проблема убивает меня. Я проверил, что символическая ссылка libjpeg.so верна. Пожалуйста, помогите!

+0

что означает 'ldd'? это недостающая библиотека, доступная для 'ldconfig'? – user2485710

+0

Я удалил его, поскольку мне нужно использовать libjpeg.so.62. – user3077759

+0

ldd исполняемого файла сказал 'libjpeg.so.62 => /usr/local/lib/libjpeg.so.62 (0xb74af000)' – user3077759

ответ

2

Я могу построить проект. Проблема в том, динамический компоновщик продолжает поиски libjpeg.so.9 и бросали

'error while loading shared libraries: libjpeg.so.9: ... No such file ... 

Вы должны понять несколько вещей:

  1. Разделяемая библиотека может иметь SONAME динамический тег (видимый с readelf -d foo.so | grep SONAME).
  2. Если исполняемый файл связан с такой библиотекой, то SONAME записывается как динамический тег NEEDED (в исполняемом файле) независимо от того, что вызывается самой библиотекой. То есть вы можете назвать библиотеку foo.so, foo.so.1234 или что-нибудь еще. Если библиотека имеет SONAME из libbar.so.7, тогда исполняемый файл потребует libbar.so.7, независимо от того, что [1].

На вашу проблему. Ваш исполняемый файл не может загрузить libjpeg.so.9, поэтому мы заключаем, что он связан (во время сборки) с общей библиотекой, которая имеет SONAME: libjpeg.so.9.

Я удалил все libjpeg. * И установлен libjpeg.so.62

Вы не должны уничтожал libjpeg.so, который используется в исполняемом сборки времени (который находится где-то кроме /usr/local/lib). Эта библиотека по-прежнему имеет SONAME: libjpeg.so.9, и вызывает у вас горе.

Вы можете узнать, какие библиотеки используются во время связи, передав флаг -Wl,-t на линии ссылки.

[1] Неправильно: если исполняемый файл не нуждается в каких-либо символах от foo.so, и если действует опция компоновщика --as-needed, то NEEDED: libbar.so.7 не будет записана в конце концов.

Update:

Я также проверить LDD исполняемый файл и возвращает libjpeg.so.62

Это означает, что исполняемый файл, который вы запускаете ldd на правильный, но исполняемый что фактически пробег нет, и они должны быть различных исполняемых файлов.

Update 2:

Вы правы. В исполняемом файле ldd показаны как libjpeg.so.62, так и libjpeg.so.9.

На самом деле, нет, я не был. Но на этот раз я буду прав.

Что происходит, так это то, что ваш исполняемый файл правильно записывает NEEDED: libjpeg.so.62 (это можно проверить с помощью следующей команды: readelf -d /path/to/exe | grep 'NEEDED.*libjpeg').

Но вы также есть другие разделяемые библиотеки (один из перечисленных в ldd выходе), который имеет не был восстановлен, и до сих пор имеет зависимость от libjpeg.so.9.

Вы можете найти эту библиотеку, запустив readelf -d /path/to/libXXX.so | grep 'NEEDED.*libjpeg\.so\.9' во всех библиотеках, перечисленных в ldd вывода.

Как только вы его найдете, вам придется перестроить его, так что это также зависит от libjpeg.so.62.

+0

Я проверил libjpg.so и дал readelf -d/usr/local/lib/libjpeg.so | grep SONAME 0x0000000e (SONAME) Библиотека soname: [libjpeg.so.62] Это означает, что libjpeg.so указывается на правильный .so.major – user3077759

+0

Я также проверяю исполняемый файл ldd и возвращает libjpeg.so.62 =>/usr /local/lib/libjpeg.so.62 (0xb76ff000) Итак, кажется, что исполняемый файл также записал правильное имя. У меня нет подсказки, которая дает мне проблему. – user3077759

+0

@ user3077759 Я обновил ответ. –

Смежные вопросы