Книга: Основы программирования в Linux

Управление библиотеками с помощью make

Управление библиотеками с помощью make

Когда вы работаете над большими проектами, часто удобно управлять компиляцией нескольких программных единиц с помощью библиотеки. Библиотеки — это файлы, в соответствии с соглашением имеющие расширение a (archive) и содержащие коллекцию объектных файлов. Для работы с библиотеками у команды make есть специальная синтаксическая запись, которая существенно облегчает управление ими.

Синтаксическая запись lib(file.о) означает объектный файл file.o, хранящийся в библиотеке lib.а. У команды make есть встроенное правило для управления библиотеками, которое обычно эквивалентно приведенному далее фрагменту:

.с.а:
 $(CC) -с $(CFLAGS)
 $< $(AR) $(ARFLAGS) $@ $*.о

Макросы $(AR) и $(ARFLAGS) подразумевают команду ar и опции rv соответственно. Довольно краткая синтаксическая запись информирует команду make о том, что для включения файла .с в библиотеку .а следует применить два следующих правила:

? первое правило говорит о том, что команда make должна откомпилировать исходный файл и сформировать объектный файл;

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

Итак, если у вас есть библиотека fud, содержащая файл bas.o, в первом правиле $< заменяется именем bas.c. Во втором правиле $@ заменяется именем библиотеки fud.а и $* заменяется именем bas.

Выполните упражнение 9.4.

Упражнение 9.4. Управление библиотекой

Правила управления библиотеками очень просто применять на практике. В этом упражнении вы измените свое приложение, сохранив файлы 2.o и 3.o в библиотеке mylib.a. Make-файл потребует лишь нескольких изменений и его новый вариант Makefile5 будет выглядеть следующим образом:

all: myapp
# Какой компилятор
CC = gcc
# Куда установить
INSTDIR = /usr/local/bin
# Где хранятся файлы include
INCLUDE =
# Опции для разработки
CFLAGS = -g -Wall -ansi
# Опции для рабочей версии
# CFLAGS = -O -Wall -ansi
# Локальные библиотеки
MYLIB = mylib.a
myapp: main.o $(MYLIB)
 $(CC) -o myapp main.o $(MYLIB)
$(MYLIB): $(MYLIB)(2.o) $(MYLIB)(3.o)
main.o: main.c a.h
2.o: 2.c a.h b.h
3.o: 3.c b.h c.h
clean:
 -rm main.o 2.o 3.o $(MYLIB)
install: myapp
 @if [ -d $(INSTDIR) ];
 then
  cp myapp $(INSTDIR);
  chmod a+x $(INSTDIR)/myapp;
  chmod og-w $(INSTDIR)/myapp;
  echo "Installed in $(INSTDIR)";
 else
  echo "Sorry, $(INSTDIR) does not exist";
 fi

Обратите внимание на то, как вы разрешили правилам по умолчанию выполнить большую часть работы. Теперь проверьте новую версию make-файла:

$ rm -f myapp *.o mylib.a
$ make -f Makefile5
gcc -g -Wall -ansi -с -o main.о main.c
gcc -g -Wall -ansi -с -o 2.о 2.c
ar rv mylib.a 2.o
a - 2.o
gcc -g -Wall -ansi -с -о 3.o 3.c
ar rv mylib.a 3.o
a - 3.о
gcc -o myapp main.о mylib.a
$ touch c.h
$ make -f Makefile5
gcc -g -Wall -ansi -с -о 3.o 3.c
ar rv mylib.a 3.o
r - 3.о
gcc -o myapp main.о mylib.a
$

Как это работает

Сначала вы удаляете все объектные файлы и библиотеку и разрешаете команде make создать файл myapp, что она и делает, откомпилировав и создав библиотеку перед тем, как компоновать файл main.о с библиотекой для создания исполняемого файла myapp. Далее вы тестируете зависимость для файла 3.o, которая информирует команду make о том, что, если меняется файл c.h, файл 3.c следует заново откомпилировать. Она делает это корректно, откомпилировав файл и обновив библиотеку перед перекомпоновкой, создающей новую версию исполняемого файла myapp.

Оглавление книги


Генерация: 1.653. Запросов К БД/Cache: 3 / 0
поделиться
Вверх Вниз