2011-01-21 5 views
6

Я пытаюсь скомпилировать программу Linux, ID3v2, и он говорит, что не может найти соответствующую библиотеку:Программа Linux не может найти общую библиотеку во время выполнения

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 [email protected] $^ -lz -lid3 

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

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

+1

Ваше имя запрашивает заголовок, но ваш вопрос явно о библиотеке во время выполнения: - /. Вы можете проверить, работает ли он, если добавить каталог, содержащий символическую ссылку, в переменную среды LD_LIBRARY_PATH. –

+0

Я явно не понимаю, что я делаю. Я попытаюсь прочитать ваше заявление и посмотреть, смогу ли я следовать вашим советам. – Scott

+0

Это может быть многообещающим ... http://stackoverflow.com/questions/3490667/compiler-not-following-symbolic-links-in-visual-studio-c – Scott

ответ

20

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

Вы создали динамически связанный исполняемый файл, который хочет быть связан с 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 исполняемого файла.
  • Recompile id3v2 статически. (Это будет работать, но не беспокойтесь.)

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

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

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

+0

Извините за директивы, я всегда «включил» файлы в PHP, coldfusion и обратно с классическим ASP. Таким образом, я понял, что «include» означает, что он включал что-то ... – Scott

+0

В него входит что-то: заголовок, содержащий декларации функций и типов переменных и т. Д., Чтобы компилятор знал типы переменных, сигнатуры методов, и т. д. Это отличается от привязки к библиотеке, которая обеспечивает доступ к конкретному исполняемому коду, встроенному или динамически связанному с окончательным исполняемым файлом. Это может сбивать с толку при переходе с интерпретируемого языка, поскольку в любом случае между исходным кодом и исполняемым кодом существует меньше различий (с точки зрения программиста). –

+0

Да, я буквально НИКОГДА не делал ничего со скомпилированным языком. Я уверен, что перечитаю все, что вы написали несколько раз. Еще раз спасибо. – Scott

3

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

sudo ln -s /usr/local/lib/libid3-3.8.so.3 /usr/lib/libid3-3.8.so.3 
2

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

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