Программа Linux не может найти общую библиотеку во время выполнения - PullRequest
8 голосов
/ 21 января 2011

Я пытаюсь скомпилировать программу linux, id3v2, и она говорит, что не может найти подходящую библиотеку:

id3v2: error while loading shared libraries: libid3-3.8.so.3: cannot open shared object file: No such file or directory

Я предполагаю, что это та часть, которая тянет в библиотеке lidid3?

Файл существует, однако на самом деле он ищет символическую ссылку на:

"ibid3-3.8.so.3.0.0"

Мне интересно, если проблема в том, что он не может переходить по символическим ссылкам? Возможно, я мог бы вручную изменить его, чтобы найти 0.0, если бы я знал, где я искал, чтобы изменить его.

Я рад уточнить любые детали.

Похоже, что включения выполняются следующим образом:

id3v2:  convert.o list.o id3v2.o genre.o
        ${CXX} ${LDFLAGS} -pedantic -Wall -g -o $@ $^ -lz -lid3

Я смог использовать совет Саймона, чтобы выяснить, что было несколько мест, где можно ожидать библиотеку. Я создаю символическую ссылку, где программа ссылалась на файл ACTUAL.

Спасибо, Саймон!

Ответы [ 3 ]

27 голосов
/ 21 января 2011

Символьные ссылки на библиотеки работают нормально, пока конечная цель, к которой они отслеживаются, существует и доступна.

Вы создали динамически связанный исполняемый файл, который желает быть связанным с libid3-3.8.so.3 во время выполнения. Вероятно, это было связано на этапе сборки с чем-то вроде -L/path/to/libid3/directory -lid3.

У вас есть несколько опций , чтобы сделать libid3 доступным, как правило, в порядке убывания предпочтений (поскольку вы не упомянули, где был файл, я могу быть только общим):

  • Создайте символическую ссылку на libid3* в каталоге, указанном в /etc/ld.so.conf (или /lib или /usr/lib)
  • Копировать libid3* в каталог, указанный в /etc/ld.so.conf (или /lib или /usr/lib) (по умолчанию)
  • Добавить каталог, содержащий libid3* в /etc/ld.so.conf
  • Установите LD_LIBRARY_PATH=/directory/path/to/libid3* перед запуском исполняемого файла id3v2.
  • Перекомпилировать id3v2 статически. (Это будет работать, но не беспокойтесь.)

После любого из первых 3 перезапустите ldconfig, чтобы кэш компоновщика обновился. (Затем вы можете запустить ldconfig -v, чтобы убедиться, что это разрешимо.)

Обратите внимание, что это не шаги, а варианты. Вам нужно сделать только 1 из них.

Рад, что вы обновили название. Директивы #include не имеют никакого отношения к связыванию.

3 голосов
/ 03 октября 2011

Я получил ту же ошибку, что и вы, и после прочтения упомянутых здесь решений я решил проблему (в Ubuntu 8) с помощью:

sudo ln -s /usr/local/lib/libid3-3.8.so.3 /usr/lib/libid3-3.8.so.3
2 голосов
/ 16 января 2013

Это решило проблему. Просто добавьте / usr / local / lib в /etc/ld.so.conf (если он там не был; поместите его только один раз), затем запустите ldconfig.

...