Чтение онлайн

на главную - закладки

Жанры

Основы программирования в Linux
Шрифт:

.с.а:

 $(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.

Более сложная тема: make-файлы и подкаталоги

При работе над большими проектами порой бывает удобно отделить от основных файлов файлы, формирующие библиотеку, и поместить их в подкаталог. С помощью команды

make
можно сделать это двумя способами.

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

mylib.a:

 (cd mylibdirectory;$(MAKE))

Это правило гласит, что вы всегда должны пытаться создать mylib.a с помощью команды

make
. Когда
make
инициирует правило создания библиотеки, она изменяет каталог на mylibdirectory и затем запускает новую команду
make
для управления библиотекой. Поскольку для этого запускается новая командная оболочка, программа, применяющая make-файл, не выполняет команду
cd
. А командная оболочка, запущенная для выполнения правила построения библиотеки, находится в другом каталоге. Скобки обеспечивают выполнение всего процесса в одной командной оболочке.

Поделиться:
Популярные книги

Лекарь Империи 7

Карелин Сергей Витальевич
7. Лекарь Империи
Фантастика:
городское фэнтези
аниме
боевая фантастика
попаданцы
5.00
рейтинг книги
Лекарь Империи 7

Глэрд VIII: Базис 2

Владимиров Денис
8. Глэрд
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Глэрд VIII: Базис 2

Наследие Маозари 5

Панежин Евгений
5. Наследие Маозари
Фантастика:
фэнтези
юмористическое фэнтези
5.00
рейтинг книги
Наследие Маозари 5

Звездная Кровь. Экзарх II

Рокотов Алексей
2. Экзарх
Старинная литература:
прочая старинная литература
5.00
рейтинг книги
Звездная Кровь. Экзарх II

Академия

Сай Ярослав
2. Медорфенов
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Академия

Я уже граф. Книга VII

Дрейк Сириус
7. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я уже граф. Книга VII

Барон отрицает правила

Ренгач Евгений
13. Закон сильного
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Барон отрицает правила

Я еще не барон

Дрейк Сириус
1. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Я еще не барон

Неудержимый. Книга XXX

Боярский Андрей
30. Неудержимый
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Неудержимый. Книга XXX

Московское золото и нежная попа комсомолки. Часть Пятая

Хренов Алексей
5. Летчик Леха
Фантастика:
попаданцы
5.00
рейтинг книги
Московское золото и нежная попа комсомолки. Часть Пятая

Законы Рода. Том 11

Андрей Мельник
11. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 11

Зодчий. Книга II

Погуляй Юрий Александрович
2. Зодчий Империи
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Зодчий. Книга II

Кодекс Охотника. Книга X

Винокуров Юрий
10. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
6.25
рейтинг книги
Кодекс Охотника. Книга X

Санек 3

Седой Василий
3. Санек
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Санек 3