Курсовая работа: Разработка статических и динамических библиотек на языке программирования С/C++ в операционных системах UNIX
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
olya:~#
Как видите все правильно. Программа использует три библиотеки:
libc.so.6 - стандартную библиотеку функций языка C++ .
ld-linux.so.2 - библиотеку динамической линковки программ ELF формата.
libfsdyn.so - нашу динамическую библиотеку функций.
Нашу библиотеку она найти не может. И правильно! Динамический линковщик ищет библиотеки только в известных ему каталогах, а каталог нашей программы ему явно не известен.
Для того, чтобы добавить нашу директорию с библиотекой в список известных директорий надо подредактировать файл /etc/ld.so.conf . Например, у меня этот файл состоит из таких строк:
olya:~# cat /etc/ld.so.conf
/usr/X11R6/lib
/usr/i386-slackware-linux/lib
/usr/i386-slackware-linux-gnulibc1/lib
/usr/i386-slackware-linux-gnuaout/lib
olya:~#
Во всех этих директории хранятся всеми используемые библиотеки. В этом списке нет лишь одной директории - /lib , которая сама по себе не нуждается в описании, так как она является главной. Получается, что наша библиотека станет "заметной", если поместить ее в один их этих каталогов, либо отдельно описать в отдельном каталоге. Давайте для теста опишем, добавим строку в конец файла ld.so.conf :
/root
У меня этот файл находится в домашнем каталога пользователя root, у Вас он может быть в другом месте. Теперь после этого динамический линковщик будет знать где можно найти наш файл, но после изменения конфигурационного файла ld.so.conf необходимо, чтобы система перечитала настройки заново. Это делает программа ldconfig . Пробуем запустить нашу программу:
olya:~# ldconfig
olya:~# ./rezultdyn
f1() = 25
f2() = 10
olya:~#
Как видите все заработало. Если теперь удалить добавленную нами строку и снова запустите ldconfig , то данные о расположении нашей библиотеки исчезнут и будет появляться таже самая ошибка.
Но описанный метод влияет на всю систему в целом и требует доступа администратора системы, т.е. root . А если Вы простой пользователь без сверх возможностей ?!
Для такого случая есть другое безболезненное решение. Это использование специальной переменной среды LD_LIBRARY_PATH , в которой перечисляются все каталоги содержащие пользовательские динамические библиотеки. Для того, чтобы установить эту переменную в командной среде bash надо набрать всего несколько команд. Для начала посмотрим есть ли у нас такая переменная среды:
olya:~# echo $LD_LIBRARY_PATH
У меня в ответ выводится пустая строка, означающая, что такой переменной среды нет. Устанавливается она следующим образом:
olya:~# LD_LIBRARY_PATH=/root
olya:~# export LD_LIBRARY_PATH