OS&SP_Part1.9_Lib.pptx
- Количество слайдов: 26
Лекция 1. 9: Использование библиотек в Linux Операционные системы и системное программирование Часть 1
Типы библиотек • Статические • Динамические: - Ранее связывание; - Позднее связывание;
Статические библиотеки Используются не посредственно при линковке программы. Преимущество - программа слинкованная один раз не зависит от библиотеки. Недостаток – при смене кода библиотеки требует повторную перелинковку приложения
Исходник библиотеки Файл fun. c #include <stdio. h> extern void show() { printf(“hello from lib”); }
Создание статической библиотеки gcc –c fun. c –o fun. o ar –rc libfun. a fun. o – создание архива библиотеки ranlib libfun. a – индексирование функций
Пример программы использующей статическую библиотеку Файл test. c #include <stdio. h> int main(int argc, char** argv) { show(); } return 0;
Сборка программы с библиотекой 1) gcc test. c libfun. a –o test 2) gcc test. c –L. -lfun –o test 3) sudo cp libfun. a /usr/lib - копируем sudo ldconfig – обновляем кеш gcc test. c –lfun –o test
Динамическая библиотека Используются при трансляции программы. Преимущество - функциональность может быть изменена без перелинковки приложения. Недостаток – программа зависит от присутствия библиотеки.
Сборка динамической библиотеки gcc –f. PIC –c fun. o – с относительной адресацией gcc –shared –o libdfun. so fun. o
Пример программы использующей динамическую библиотеку при раннем связывании Файл test 2. c #include <stdio. h> extern void show(); int main(int argc, char** argv) { show(); } return 0;
Использование динамической библиотеки при раннем связывании sudo cp libdfun. so /usr/lib sudo ldconfig gcc test 2. c –ldfun –o test 2
Программа использующая динамическую библиотеки при позднем связывании Файл test 3. c #include <stdio. h> #include <dlfcn. h> int main(int argc, char** argv) { void *h = dlopen(“/usr/libdfun. so", RTLD_LAZY); void (*fun)() = dlsym(h, “show"); (*fun)(); dlclose(h); } return 0;
Сборка программы использующей динамическую библиотеку с поздним связыванием gcc -rdynamic -o test 3. c -ldl
Дополнительные возможности динамических библиотек в библиотеках можно задавать инициализирующую и деинициализирующую функции: • void _init() - инициализация • void _fini() - деинициализация Сборка с обязательным параметром –nostdlib: gcc –f. PIC –c fun. c –o fun. o gcc -shared -o libdfun. so fun. o -nostdlib
Использование библиотек при программировании на C++ extern "C" PROTOTYPE Использование как при реализации функции, так и при объявлении в программе назначения.
КОНТРОЛЬНЫЕ ВОПРОСЫ
Основное отличие статической и динамической библиотеки?
Каким ключевым словом помечается функция если она предназначена для экспорта?
Какое предназначение у утилит ra и runlib?
Чем отличаются ключи компилятора –l и –L?
Что означает использование ключа -f. PIC при компиляции
Для чего нужен ключ –shared?
Чем отличается раннее связывание от позднего?
Для чего подключается заголовок <dlfcn. h>?
Когда будут вызывать функции обратного вызова void _init() и void _fini() ?
OS&SP_Part1.9_Lib.pptx