Курсовая работа: Разработка статических и динамических библиотек на языке программирования С/C++ в операционных системах UNIX
olya:~# LD_LIBRARY_PATH=/root:${LD_LIBRARY_PATH}
olya:~# export LD_LIBRARY_PATH
Если обнулить эту переменную, то снова библиотека перестанет работать:
olya:~# LD_LIBRARY_PATH=""
olya:~# export LD_LIBRARY_PATH
olya:~# ./rezultdyn
./rezultdyn: error in loading shared libraries: libfsdyn.so: cannot open
shared object file: No such file or directory
olya:~#
Также параллельно можно зайти в систему под другим пользователем или даже тем же самым, но если просмотреть значение LD_LIBRARY_PATH , то увидим ее прежнее значение. Это означает, что два разных пользователя Linux не могут влиять на работу друг друга, а это и есть самое главное хорошее отличие систем Unix от большинства других систем.
4 Создание динамических библиотек
4.1 Функции работы с динамическими библиотеками
Оказывается, что использовать динамические библиотеки можно не только в начале загрузки, но и в процессе самой работы программы. Программа сама может вызывать любые функции из библиотеки, когда ей захочется. Для этого всего-лишь надо использовать библиотеку dl , которая позволяет линковать библиотеки "на лету". Она управляет загрузкой динамических библиотек, вызовом функций из них и выгрузкой после конца работы.
Для использования функций программной работы с динамическими библиотеками необходимо подключить заголовочный файл:
#include <dlfcn.h>
Чтобы вызывать какие-то функции из динамической библиотеки сначала надо открыть эту библиотеку (можно сказать "загрузить"). Открывается она функцией:
void *dlopen (const char *filename, int flag);
Параметр filename содержит путь до требуемой библиотеки, а параметр flag задает некоторые специфические флаги для работы. Функция возвращает указатель на загруженную библиотеку. В случае любой ошибки возвращается указатель NULL . В таком случае тест ошибки понятный человеку можно получить с помощью функции dlerror() . Пока мы не будем задумываться над этим, и я приведу стандартный код для открытия библиотеки:
void *library_handler;
//......
//загрузка библиотеки
library_handler = dlopen("/path/to/the/library.so",RTLD_LAZY);
if (!library_handler){
//если ошибка, то вывести ее на экран
fprintf(stderr,"dlopen() error: %s\n", dlerror());
exit(1); // в случае ошибки можно, например, закончить работу программы
};
После этого можно работать с библиотекой. А работа эта заключается в получении адреса требуемой функции из библиотеки. Получить адрес функции или переменной можно по ее имени с помощью функции:
void *dlsym(void *handle, char *symbol);