Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторные_ работы_Linux.doc
Скачиваний:
7
Добавлен:
22.04.2019
Размер:
619.52 Кб
Скачать

Пример совместно используемой библиотеки

Для того, чтобы создать и использовать динамическую (совместно используемую) библиотеку, достаточно переделать в нашем проекте Makefile.

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

# MakefileforWorldproject

binary: main.o libworld.so

gcc -o binary main.o -L. -lworld -Wl,-rpath,.

main.o: main.c

gcc -c main.c

libworld.so: h_world.o g_world.o

gcc -shared -o libworld.so h_world.o g_world.o

h_world.o: h_world.c

gcc -c -fPIC h_world.c

g_world.o: g_world.c

gcc -c -fPIC g_world.c

clean:

rm -f *.o *.so binary

−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−

Внешне ничего не изменилось: программа компилируется, запускается и выполняет те же самые действия, что и в предыдущем случае. Изменилась внутренняя суть, которая играет для программиста первоочередную роль. Рассмотрим все по порядку.

Правило для сборки binary теперь содержит пугающую опцию “-Wl,-rpath,.”. Ничего страшного тут нет. Как уже неоднократно говорилось, компилятор gcc сам вызывает линковщик ld, когда это надо и передает ему нужные параметры сборки, избавляя нас от ненужной платформенно-зависимой волокиты. Но иногда мы все-таки должны вмешаться в этот процесс и передать линковщику "свою" опцию. Для этого используется опция компилятора -Wl,option,optargs,... Расшифровываю: передать линковщику (-Wl) опцию option с аргументами optargs. В нашем случае мы передаем линковщику опцию -rpath с аргументом . (точка, текущий каталог). Возникает вопрос: что означает опция -rpath? Как уже говорилось, линковщик ищет библиотеки в определенных местах; обычно это каталоги /lib и /usr/lib, иногда /usr/local/lib. Опция -rpath просто добавляет к этому списку еще один каталог. В нашем случае это текущий каталог. Без указания опции -rpath, линковщик "молча" соберет программу, но при запуске нас будет ждать сюрприз: программа не запустится из-за отсутствия библиотеки. Попробуйте убрать опцию -Wl,-rpath,. из Makefile и пересоберите проект. При попытке запуска программа binary завершится с кодом возврата 127 (о кодах возврата будет рассказано в последующих главах). То же самое произойдет, если вызвать программу из другого каталога. Верните обратно -Wl,-rpath,., пересоберите проект, поднимитесь на уровень выше командой cd .. и попробуйте запустить бинарник командой world/binary. Ничего не получится, поскольку в новом текущем каталоге библиотеки нет.

Есть один способ не передавать линковщику дополнительных опций при помощи -Wl - это использование переменной окружения LD_LIBRARY_PATH. В последующих главах мы будем подробно касаться темы окружения (environment). Сейчас лишь скажу, что у каждого пользователя есть так называемое окружение (environment) представляющее собой набор пар ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ, используемых программами. Чтобы посмотреть окружение, достаточно набрать команду env. Чтобы добавить в окружение переменную, достаточно набрать export ПЕРЕМЕННАЯ=ЗНАЧЕНИЕ, а чтобы удалить переменную из окружения, надо набрать export -n ПЕРЕМЕННАЯ. Будьте внимательны: export - это внутренняя команда оболочки BASH; в других оболочках (csh, ksh, ...) используются другие команды для работы с окружением. Переменная окружения LD_LIBRARY_PATH содержит список дополнительных "мест", разделенных двоеточиями, где линковщик должен искать библиотеку.

Не смотря на наличие двух механизмов передачи информации о нестандартном расположении библиотек, лучше помещать библиотеки в конечных проектах в /lib и в /usr/lib. Допускается расположение библиотек в подкаталоги /usr/lib и в /usr/local/lib (с указанием -Wl,-rpath). Но заставлять конечного пользователя устанавливать LD_LIBRARY_PATH почти всегда является плохим стилем программирования.

Следующая немаловажная деталь - это процесс создания самой библиотеки. Статические библиотеки создаются при помощи архиватора ar, а совместно используемые - при помощи gcc с опцией -shared. В данном случае gcc опять же вызывает линковщик, но не для сборки бинарника, а для создания динамической библиотеки.

Последнее отличие - опции -fPIC (-fpic) при компиляции h_world.c и g_world.c. Эта опция сообщает компилятору, что объектные файлы, полученные в результате компиляции должны содержать позиционно-независимый код (PIC — Position Independent Code), который используется в динамических библиотеках. В таком коде используются не фиксированные позиции (адреса), а плавающие, благодаря чему код из библиотеки имеет возможность подключаться к программе в момент запуска.

Лабораторные задания

В соответствии с вариантом задания разработать и отладить библиотеку. Все задания компилировать с помощью утилиты MAKE.

1. В тексте определить количество символов, которые не являются ни цифрами, ни буквами.

2. Для заданной матрицы получить вектор, каждый элемент которой равен сумме элементов строки матрицы.

3. Выделить первое и последнее слова текста.

4. Дана матрица A(5,5) и вектор X(5). Вычислить произведение матрицы на вектор.

5. Дана матрица B(4,5). Найти столбец с максимальной суммой элементов.

6. Даны два массива по 10 элементов каждый. Найти сумму квадратов разностей

элементов массивов с одинаковыми индексами.

7. В тексте вставить между вторым и третьим словом новое слово.

8. Для матрицы определить каких элементов больше: положительных или отрицательных.

9. В тексте определить количество заключенных в круглые скобки символов.

10. Вывести на экран второе и четвертое слова произвольной строки.

11. В тексте найти и вывести слова, содержащие сочетание символов LF.

12. Для квадратной матрицы найти сумму элементов, находящихся выше главной диагонали.

13. Поменять элементы массива первый с последним, второй с предпоследним и т.д.

14. В матрице, в строке содержащей нуль, расположить элементы по убыванию.

15. В матрице максимальный элемент строки заменить средним арифметическим этой строки.

16. В матрице определить максимальный элемент каждого столбца и записать их в массив.

17. Создать матрицу. Найти две строки в которых элементы одинаковы, но стоят в разной последовательности.

18. В матрице определить сумму каждой строки и строчку с максимальной суммой записать в массив.

19. В матрице упорядочить элементы главной диагонали по возрастанию и найти сумму элементов стоящих под главной диагональю.

20. В матрице определить сумму положительных чисел каждого столбца и записать их в новый массив.

Библиография

1. Дансмур М. Операционная система UNIX и программирование на языке Си. /

Дансмур М., Дейвис Г. - М.: Радио и связь, 1989. – 192 с.

2. Рейчард К. Linux: справочник / К. Рейчард, П. Фолькердинг. - СПб.: Питер

Кон, 1999. – 480 с.

3. Робачевский А.М. Операционная система UNIX. - СПб.: BHV-Санкт-

Петербург, 1997. - 528 с.

4. Стивенс У. UNIX: взаимодействие процессов. – СПб.: Питер, 2003. – 576 с.

5. Теренс Чан Системное программирование на С++ для UNIX. К.: Издательская

группа BHV, 1997. - 592 с.

6. Хэвиленд К., Грэй Д., Салама Б. Системное программирование в UNIX. Руко-

водство программиста. – М., ДМК Пресс, 2000. – 368 с.

7. Серия статей Андрея Боровского, http://www.citforum.ru/programming/unix/borovsky/

8. Процессы в Linux, http://www.prolinux.ru/introduction/about-linux-processes/

9. Иванов Н. Н. «Программирование в Linux с нуля». http://www.lindevel.ru/zlp/

69