Я могу построить проект. Проблема в том, динамический компоновщик продолжает поиски libjpeg.so.9 и бросали
'error while loading shared libraries: libjpeg.so.9: ... No such file ...
Вы должны понять несколько вещей:
- Разделяемая библиотека может иметь
SONAME
динамический тег (видимый с readelf -d foo.so | grep SONAME
).
- Если исполняемый файл связан с такой библиотекой, то
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
.
что означает 'ldd'? это недостающая библиотека, доступная для 'ldconfig'? – user2485710
Я удалил его, поскольку мне нужно использовать libjpeg.so.62. – user3077759
ldd исполняемого файла сказал 'libjpeg.so.62 => /usr/local/lib/libjpeg.so.62 (0xb74af000)' – user3077759