Основы программирования в Linux - Мэтью Нейл
myapp: main:о 2.о 3.omain.о: main.c a.h2.о: 2.с a.h b.h3.o: 3.c b.h c.hСписок свидетельствует о том, что myapp зависит от main.о, 2.o и 3.o, a main.o зависит от main.c и a.h и т. д.
Данный набор зависимостей формирует иерархию, показывающую, как исходные файлы связаны друг с другом. Вы легко можете увидеть, что если изменяется b.h, то придется пересмотреть 2.o и 3.o, а поскольку 2.o и 3.o будут изменены, вам придется перестроить и myapp.
Если вы хотите собрать несколько файлов, можно использовать фиктивную цель или задание
allall: myapp myapp.1И еще раз, если вы не включите задание
allmakeВторой, компонент make-файла — правила или инструкции, описывающие способ создания выходного файла задания. В примере из предыдущего раздела какую команду следует применить после того, как команда
makegcc -с 2.сmakeВ данный момент мы должны информировать вас об очень странной и неудачной синтаксической записи, применяемой в make-файлах: разнице между пробелом и табуляцией. Все правила должны представлять собой строки, начинающиеся со знака табуляции; пробел не годится. Так как несколько пробелов и табуляция выглядят почти одинаково и поскольку почти во всех других случаях, касающихся программирования в системе Linux, нет большой разницы между пробелами и табуляциями, это может вызвать проблемы. Кроме того, пробел в конце строки в make-файле может вызвать сбой при выполнении команды
makemakeА теперь выполните упражнение 9.1.
Большинство правил или инструкций состоит из простой команды, которая могла бы быть набрана в командной строке. Для примера создайте свой первый make-файл Makefile1:
myapp: main.о 2.o 3.o gcc -о myapp main.о 2.o 3.omain.о: main.c a.h gcc -с main.c2.о: 2.с a.h b.h gcc -с 2.с3.o: 3.c b.h c.h gcc -с 3.cЗапустите команду
make-f$ <b>make -f Makefile1</b>make: *** No rule to make target 'main.c', needed by 'main.o'. Stop.$Команда
makemyappmaketouch$ <b>touch a.h</b>$ <b>touch b.h</b>$ <b>touch c.h</b>Файл main.c содержит функцию
mainfunction_twofunction_threefunction_twofunction_three#include/* main.c */#include <stdlib.h>#include "a.h"extern void function_two();extern void function_three();int main() { function_two(); function_three(); exit(EXIT_SUCCESS);}/* 2.c */#include "a.h"#include "b.h"void function_two() { }/* 3.с */#include "b.h"#include "c.h"void function_three() { }Теперь попробуйте выполнить команду make еще раз:
$ <b>make -f Makefile1</b>gcc -с main.с gcc -с 2.сgcc -с 3.сgcc -о myapp main.о 2.о 3.о$На этот раз сборка прошла успешно.
Как это работает
Команда
makemakemake