Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
lr7.pdf
Скачиваний:
14
Добавлен:
01.04.2022
Размер:
1.03 Mб
Скачать

Рисунок 6 – Состав каталога “library”

2. Скомпилировать объектные файлы для создания динамической библиотеки.

Объектные файлы для динамической библиотеки компилируются особым образом. Они должны содержать так называемый позиционно-независимый код (Position Independent Code). Наличие такого кода позволяет библиотеке подключаться к программе, когда последняя загружается в память. Это связано с тем, что библиотека и программа не являются единой программой, а значит,

как угодно могут располагаться в памяти относительно друг друга. Введите следующие команды, для создания динамической библиотеки. Компиляция объектных файлов для динамической библиотеки должна выполняться с опцией -fPIC компилятора gcc(Рисунок 7):

$ gcc -c -fPIC source/*.c

В отличие от статической библиотеки динамическую создают при помощи gcc,

указав опцию -shared(Рисунок 7): $ gcc -shared -o libmy.so *.o

Просмотрите содержимое директории "library"(Рисунок 7): $ ls –la

Рисунок 7 – Результат выполнения команд Использованные объектные файлы можно удалить(Рисунок 8): $ rm *.o

В итоге получим новое содержимое каталога library: "libmy.so", "mylib.h" и

"source".

Рисунок 8 – Состав каталога “library”

Теперь в каталоге "project" (который находится на одном уровне файловой иерархии с "library") создайте файлы проекта, который будет использовать созданную библиотеку. Поскольку сама программа будет состоять не из одного файла, то придется здесь также создать заголовочный файл.

Рисунок 9 – Создание файла «data.c»

Функция data() запрашивает у пользователя данные, помещая их в массив strs.

Далее вызывает библиотечную функцию diagonals(), которая выводит на экране "диагонали". После этого на каждой итерации цикла вызывается библиотечная функция text(), которой передается очередной элемент массива.

Функция text() выводит на экране звездочки, число которых равно длине переданной через указатель строки. Обратите внимание на то, как подключается заголовочный файл библиотеки: через относительный адрес. Две точки обозначают переход в каталог на уровень выше, т.е. родительский по отношению к "project", после чего путь продолжается во вложенный в родительский каталог "library". Можно было бы указать абсолютный путь,

например, "/home/sv/c/les_21/library/mylib.h". Однако при перемещении каталогов библиотеки и программы на другой компьютер или в другой каталог адрес был бы уже не верным. В случае с относительным адресом требуется лишь сохранять расположение каталогов "project" и "library" относительно друг друга.

Рисунок 10 – Создание файла «main.c»

Здесь два раза вызывается библиотечная функция rect() и один раз функция data() из другого файла проекта. Чтобы сообщить функции main() прототип data() также подключается заголовочный файл проекта.

Рисунок 11 – Создание файла «figure.c»

Сделайте снимок экрана с содержимым директории "project"(Рисунок 12).

Рисунок 12 – Состав каталога “project”

Из обоих файлов проекта с исходным кодом надо получить объектные файлы для объединения их потом с файлом библиотеки. С какой бы библиотекой мы не компоновали объектные файлы проекта, компилируются они как для статической, так и динамической библиотеки одинаково(Рисунок 13):

$ gcc -c *.c

При этом не забудьте сделать каталог "project" текущим!

Соседние файлы в предмете Системное программирование