Главная страница

Курс на Си. Подбельский. Курс программирования на Си. В., Фомин С. С. Курс программирования на языке Си Учебник


Скачать 1.57 Mb.
НазваниеВ., Фомин С. С. Курс программирования на языке Си Учебник
АнкорКурс на Си
Дата18.02.2023
Размер1.57 Mb.
Формат файлаdocx
Имя файлаПодбельский. Курс программирования на Си.docx
ТипУчебник
#943863
страница27 из 42
1   ...   23   24   25   26   27   28   29   30   ...   42

Стандартные библиотеки. Стандартные библиотеки UNIX хра­нятся в каталогах /lib или /usr/lib. Ссылка на библиотеки осуществ­ляется при помощи ключа компоновщика -l, который задается в команде сс вызова компилятора языка Си после всех ключей и параметров компилятора. Непосредственно за ключом (без пробела) указывается идентификатор библиотеки, например:

%cc . . . . -lx

где x - часть имени библиотеки (полное имя библиотеки в данном случае libx.a; стандартный префикс для библиотеки «lib»; стандарт-


■■III
Подготовка и выполнение программ

ное расширение имени для библиотеки 'a'). Обратите внимание, что libx.a есть название библиотеки, а не отдельного модуля, поэтому суффикс '.a' не обозначает «модуль на ассемблере», как, например, на рис. 8.2.

Стандартная библиотека языка Си просматривается компонов­щиком автоматически, то есть указание этой библиотеки в команд­ной строке вызова компилятора Си не требуется. Эта библиотека хранится в файле /lib/libc.a.

Библиотека математических функций хранится в файле /lib/ libm.a, поэтому указание библиотеки в команде вызова компилято­ра будет таким: -lm. Напомним, что ключ -l, являющийся ключом компоновщика, необходимо разместить в командной строке вызова компилятора Си после всех других ключей и параметров, так как просмотр библиотеки должен происходить после компиляции, когда становится известно, какие функции из библиотеки нужны для по­строения исполняемого модуля.

Создание и сопровождение собственных библиотек. В UNIX для создания и сопровождения библиотек объектных модулей слу­жит программа ar (archivator - архиватор). Для библиотек в UNIX принят термин «архив»; отсюда в качестве расширения имени биб­лиотеки используется буква 'а'.

При создании библиотеки необходимо иметь в виду, что компо­новщик просматривает библиотечный файл только один раз. Если объектный модуль функции ссылается на другие имена из той же библиотеки, то он должен быть расположен в библиотеке до этих объектных модулей. Некоторые версии UNIX содержат программу ranlib, которая создает оглавление библиотеки, что позволяет ком­поновщику ld обращаться к элементам библиотеки в произвольном порядке. В некоторых реализациях UNIX функция построения оглавления библиотеки встроена в программы ar и ld.

Главное назначение программы ar - создание и обновление биб­лиотечных файлов, используемых компоновщиком, однако ее мож­но применять и для любых других, аналогичных целей. Формат команды ar:

ar -ключ [ключ...] [позиционное_имя] архив имя. . .

Параметры в команде отделяются пробелами.

Параметр позиционное_имя не является обязательным. Ключей может быть несколько, тогда они записываются без пробелов и толь­ко с одним знаком '-'.

Параметр архив задает имя архивного файла.

Параметр имя... является списком имен объектных модулей, ко­торые либо находятся в архиве, либо должны быть туда помещены.

Ключи программы ar имеют следующий смысл:

  • -d - исключить указанные (с помощью параметра имя...) фай­лы из архивного файла;

  • -г - заменить указанные (параметром имя...) файлы в архивном файле. Если вместе с ключом r задается необязательный ключ u, то заменяются только файлы, имеющие более поздние даты модификации, чем файлы в архиве. Этот же ключ использует­ся для включения в библиотеку новых файлов, то есть файлы, указанные параметром имя... и отсутствующие в библиотеке, добавляются в архив. Обычно новые файлы помещаются в ко­нец архива. Если указать имя файла из архива в параметре по- зиционное_имя, то можно новые файлы поместить до или после этого файла. Для этого необходимо соответственно добавить к ключу -r необязательные литеры b (before) или a (after);

  • -t - вывести в стандартный поток вывода оглавление архив­ного файла. При задании параметра имя... печатается инфор­мация только об указанных этим параметром файлах. Этот же ключ используется для включения в библиотеку новых фай­лов, то есть файлы, указанные параметром имя... и отсутствую­щие в библиотеке, добавляются в архив;

  • -p - вывести в стандартный поток вывода указанные (пара­метром имя...) файлы из архива;

  • -x - извлечь из архива указанные (параметром имя...) файлы. Если не задан параметр имя..., из архива извлекаются все фай­лы. В любом случае собственно архивный файл не изменяется;

  • -v - выдавать пояснительные сообщения;

  • -c - создать архивный файл. Обычно программа ar при необ­ходимости создает архивный файл сама. Данный ключ подав­ляет информационное сообщение, выдаваемое при создании архивного файла.

Для размещения в личной библиотеке объектных модулей функ­ций иллюстративной программы необходимо выполнить следую­щую команду:

%ar -rv libtree.a add_node.o new_node.o print.o

Здесь libtree.a - имя библиотеки (архивного файла).

Ключ -r задает режим замены объектных модулей, хранящих­ся в библиотеке, на объектные модули, список которых приведен в командной строке вызова архиватора ar после имени библиотеки. Так как в момент обработки указанной команды библиотеки не су­ществовало, она будет создана автоматически. Ключ -v определяет режим вывода пояснительных сообщений о работе архиватора ar.

После занесения объектных модулей в библиотеку необходимо при помощи программы ranlib скорректировать (или создать) оглав­ление библиотеки, выполнив команду

%ranlib libtree.a

Рекомендуется ознакомиться с описанием программы ranlib до ее использования. Например, справку о ней можно получить так:

%man ranlib

Проверим созданную библиотеку, распечатав ее оглавление:

%ar -t libtree.a _ _.SYMDEF add_node.o new_node.o print.o

Первая строка - вызов программы-архиватора (ar). Последние 4 строки - это результат работы команды ar. Оглавление библио­теки содержится в разделе библиотеки _ _.SYMDEF. Остальные строки - это имена объектных модулей, находящихся в библиоте­ке. После того как библиотека объектных модулей создана, можно построить исполняемый модуль программы сортировки на основе бинарного дерева с помощью команды:

%cc -o tree tree.c -ltree

Здесь транслируется головной модуль (tree.c), объектные модули на этапе компоновки выбираются из библиотеки libtree.a, и строит­ся исполняемая программа с именем tree. Ключ компоновщика -l позволяет задать имя библиотеки объектных модулей (полное имя библиотеки: libtree.a).

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

%cc -c add_node.c

%ar -rv libtree.a add_node.o

%cc -o tree tree.o -ltree

На этот раз нет необходимости в повторной трансляции головно­го модуля (он не подвергался правке), поэтому в последней строке задано имя уже существующего объектного модуля tree.o.

Применим в той же иллюстративной программе утилиту make для поддержания личной библиотеки объектных модулей в таком состоянии, когда она всегда содержит объектные модули, получен­ные из последних версий соответствующих исходных модулей. Вы­ше был приведен пример файла зависимостей утилиты make, в ко­тором все объектные модули, используемые для построения испол­няемого модуля программы сортировки, указывались в командной строке вызова компилятора. В варианте make-файла, ориентирован­ном на применение личной библиотеки объектных модулей, появля­ются два целевых файла: исполняемая программа сортировки (tree) и библиотека объектных модулей (libtree.a), причем исполняемая программа зависит от содержимого (объектных модулей) библио­теки. Взаимозависимость этих объектов определяется следующим образом:

tree: tree.o \ add_node.o \ new_node.o \ print.o \ libtree.a

libtree.a: libtree.a(add_node.o) \ libtree.a(new_node.o) \ libtree.a(print.o)

Обратите внимание, как указаны зависимость целевого файла tree от библиотеки libtree.a и, в свою очередь, ее зависимость от объ­ектных модулей. Объектный модуль из библиотеки libtree.a указы­вается так:

имя_библиотеки(имя_модуля).

Для окончательного оформления make-файла используем два встроенных макроса утилиты make:

  • $@ - задает имя текущего целевого файла (в нашем случае - последнего (libtree.a));

  • $? - значение этого макроса вычисляется утилитой make - это имена всех модулей, которые подвергались изменениям.

Приведем один из вариантов полного текста make-файла (напом­ним, что его имя по умолчанию - makefile), позволяющего обнов­лять целевые файлы (исполняемую программу и библиотеку объ­ектных модулей) в соответствии с изменениями в исходных текстах функций, входящих в состав иллюстративной программы:

tree: tree.o \

add_node.o \

new_node.o \ print.o \ libtree.a libtree.a: libtree.a(add_node.o) \ libtree.a(new_node.o) \ libtree.a(print.o)

ar -rv $@ $?

ranlib $@

cc -o tree tree.c -ltree

Теперь, для того чтобы построить исполняемый модуль, учитываю­щий все внесенные изменения в любые функции программы сор­тировки, необходимо просто набрать на клавиатуре команду make.

После внесения изменений, например в исходный текст функции new_node( ), и при выполнении команды make получим на экране дисплея следующий протокол:

%make

cc -o -c new_node

ar -rv libtree.a new_node.o

r - new_node.o ranlib libtree.a

cc -o tree tree.c -ltree

Строка, следующая за командой вызова архиватора ar (r - new_ node.o), - это сообщение архиватора о замене объектного модуля new_node.o в библиотеке libtree.a.

Контрольные вопросы

  1. Опишите упрощенную схему подготовки программ к выполне­нию, характерную для большинства операционных систем.

  2. Дайте определения исходного и объектного модулей.

  3. Объясните необходимость существования объектного модуля.

  4. Перечислите возможные технологии сборки готовой к выпол­нению программы.

  5. Для чего служит утилита make в операционных системах семей­ства UNIX?

  6. Опишите схему подготовки исполняемой программы в ОС UNIX.

  7. Что является исходными данными для утилиты make?

  8. Дайте определение целевого файла.

  9. Приведите формат файла описаний зависимостей модулей.

  10. Припомните формат команды make.

  11. Что позволяет использование библиотек объектных модулей?

  12. Опишите процесс трансляции и выполнения программ из команд­ной строки ОС UNIX.

Приложение 1

ТАБЛИЦЫ КОДОВ ASCII

Таблица П1.1. Коды управляющих символов (0-31)

Символ

Код 10

Код 08

Код 16

Клавиши

Значение

nul

0

0

00

"@

Нуль

soh

1

1

01

"A

Начало заголовка

stx

2

2

02

"B

Начало текста

etx

3

3

03

"C

Конец текста

eot

4

4

04

"D

Конец передачи

enq

5

5

05

"E

Запрос

ack

6

6

06

"F

Подтверждение

bel

7

7

07

"G

Сигнал (звонок)

bs

8

10

08

"H

Забой (шаг назад)

ht

9

11

09

"I

Горизонтальная табуляция

lf

10

12

0A

"J

Перевод строки

vt

11

13

0B

"K

Вертикальная табуляция

ff

12

14

0C

"L

Новая страница

cr

13

15

0D

"M

Возврат каретки

so

14

16

0E

"N

Выключить сдвиг

si

15

17

0F

"O

Включить сдвиг

dle

16

20

10

"P

Ключ связи данных

dc1

17

21

11

"Q

Управление устройством 1

dc2

18

22

12

"R

Управление устройством 2

dc3

19

23

13

"S

Управление устройством 3

dc4

20

24

14

"T

Управление устройством 4

nak

21

25

15

"U

Отрицательное подтверждение

syn

22

26

16

"V

Синхронизация

etb

23

27

17

"W

Конец передаваемого блока

can

24

30

18

"X

Отказ

em

25

31

19

"Y

Конец среды

sub

26

32

1A

"Z

Замена

esc

27

33

1B

"[

Ключ
1   ...   23   24   25   26   27   28   29   30   ...   42


написать администратору сайта