- •Методические указания для выполнения лабораторной работы № 4 по курсу «Операционные системы и системное программирование»
- •Цель работы
- •Краткие теоретические сведения Статические библиотеки.
- •Динамические библиотеки (shared).
- •Ход работы
- •Варинаты индивидуальных заданий
- •Содержание отчета
- •Используемые источники
Министерство образования Республики Беларусь
ПОЛОЦКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
Кафедра технологий программирования
Методические указания для выполнения лабораторной работы № 4 по курсу «Операционные системы и системное программирование»
«Статические и динамические библиотеки в Linux»
Полоцк, 2017
Цель работы
Создание статических и динамических библиотек. И использования библиотек в собственных программах.
Краткие теоретические сведения Статические библиотеки.
Статическая библиотека - это такая библиотека, которая связывается (линкуется) с программой в момент компиляции оной. При этом объектный код библиотеки помещается в исполняемый файл программы. С этой точки зрения статическая библиотека похожа на исходный код программы, с которой она связывается, за исключением того, что библиотека компилируется "кем-то еще" и программист, использующий библиотеку, имеет дело исключительно только с результатом этой компиляции.
В Linux, как правило, файл-статическая_библиотека имеет расширение ".a".
Исходный код библиотеки:
#include <stdio.h>
extern int hello()
{
printf("Hello world! I'm static libraryn");
return 0;
};
Сохраните его в файле static.c
Ключевое слово extern необходимо для того, чтобы функция была видна в программе.
Теперь скомпилируем (! без линковки) библиотеку:
gcc -c static.c -o static.o
(на выходе имеем файл static.o, содержащий объектный код нашей библиотеки)
ar rc libMY_STATIC.a static.o
ar упаковывает несколько (! Это важно. Дело не ограничивается только одним объектным файлом) объектных файлов в одну статическую библиотеку. Статическая библиотека имеет расширение ".a", при этом ее название должно начинаться с "lib" (дань традиции).
Параметры ar:
r - предписывает заменять старые версии объектных файлов новыми - необходим для переупаковки библиотеки;
c - создать статическую библиотеку, если та еще не существует.
Проиндексируем функции внутри библиотеки для более быстрой линковки:
ranlib libMY_STATIC.a
Итак, мы получили статическую библиотеку libMY_STATIC.a.
Теперь попытаемся использовать библиотеку в нашей программе:
Исходный текст программы (C):
#include <stdio.h>
int main()
{
int x = hello();
printf("Return code: %dn",x);
return 0;
}
Сохраните его в файле program1.c
Способы связывания библиотеки и программы:
Скомпилируем и слинкуем (в том числе с нашей библиотекой) нашу программу:
gcc program1.c libMY_STATIC.a
(предполагается, что в качестве аргумента gcc будут переданы полные пути (!) к вашим библиотекам)
И запустим:
./a.out
На выходе получим:
Hello world! I'm static library
Return code: 0
Скомпилируйте с помощью команды:
gcc program1.c -L. -lMY_STATIC -o a1.out
Смысл аргументов:
-L - путь к каталогу, содержащему наши библиотек (используйте "-L -L - название нашей библиотеки (это важно - название (!), а не имя файла - собственно, если библиотека имеет своим именем "libBLABLABLA.a", то ее названием будет "BLABLABLA" - т.е. имя без приставки "lib" и расширения ".a") (для нескольких библиотек используйте "-l -l ...")
Запустите файл a1.out на выполнение и удостовертесь, что результаты те же, что и в предыдущем пункте.
Видоизменим предыдущий способ - уберем аргументы "-L":
В начале проверим значение переменной LD_LIBRARY_PATH и содержимое файла /etc/ld.so.conf:
echo $LD_LIBRARY_PATH ; cat /etc/ld.so.conf
На экране появился некоторый список каталогов - это те каталоги, в которых система ищет библиотеки при их линковке с программой (еще к таким каталогам относятся:
/lib
/usr/lib
Поместите libMY_STATIC.a в один из этих каталогов (например,в каталог /usr/lib):
su -c 'cp libMY_STATIC.a /usr/lib'
(в Ubuntu - sudo cp libMY_STATIC.a /usr/lib)
ldconfig
(ldconfig обновляет кеш данных о библиотеках линковщика)
Теперь скомпилируем и запустим нашу программу:
gcc program1.c -lMY_STATIC -o a2.out
./a2.out
Результат:
Hello world! I'm static library
Return code: 0
Таким вот способом вы можете подключать к своей программе любые статические библиотеки из приведенных выше каталогов.
* Бывает полезно определить все прототипы функций библиотеки в некотором заголовочном файле, который будет потом включаться в вашу программу. Это не обязательно, но удобно.
Статические библиотеки на языке C++.
Принцип создания аналогичен статическим библиотекам на C, но перед каждой экспортируемой функцией не забывайте добавлять:
extern "C"
(экспортировать как функцию на C - т.е. без расширения имен).
* Кстати, используйте g++ вместо gcc, если захотите протестировать примеры.
Подключение к вашей программе аналогично подключению к программе, написанной на C, за исключением необходимости явно добавлять к тексту программы прототипы импортируемых функций в следующем виде:
extern "C" PROTOTYPE
Где PROTOTYPE - прототип импортируемой функции.
* При подключении статических библиотек на C++ к программе на C сопряжено с некоторыми трудностями - т.к. при компиляции и линковки программы необходимо будет также вручную подключить системные библиотеки для реализации функционала, предоставляемого библиотекой