Программирование для Linux. Профессиональный подход | страница 11
>reciprocal.o
и >main.o
, поскольку нельзя скомпоновать программу, не создав оба объектных файла. Последние должны перестраиваться при изменении соответствующих исходных файлов. Нельзя также забывать о файле >reciprocal.hpp
: он включается в оба исходных файла, поэтому его изменение тоже затрагивает объектные файлы.Помимо очевидных целевых модулей должен также существовать модуль >clean
. Он предназначен для удаления всех сгенерированных объектных файлов и программ, чтобы можно было начать все сначала. Правило для данного модуля включает команду >rm
, удаляющую перечисленные файлы.
Чтобы передать всю эту информацию утилите >make
, необходимо создать файл >Makefile
. Его содержимое будет таким:
>reciprocal: main.o reciprocal.o
> g++ $(CFLAGS) -о reciprocal main.o reciprocal.o
>main.o: main.c reciprocal.hpp
> gcc $(CFLAGS) -c main.c
>reciprocal.o: reciprocal.cpp reciprocal.hpp
> g++ $(CFLAGS) -c reciprocal.cpp
>clean:
> rm -f *.o reciprocal
Целевые модули перечислены слева. За именем модуля следует двоеточие и существующие зависимости. В следующей строке указано правило, по которому создается модуль (назначение записи >$(CFLAGS)
мы пока проигнорируем). Строка правила должна начинаться с символа табуляции, иначе утилита >make
проинтерпретирует ее неправильно.
Если удалить созданные нами выше объектные файлы и ввести
>% make
будет получен следующий результат:
>% make
>gcc -c main.c
>g++ -c reciprocal.cpp
>g++ -o reciprocal main.o reciprocal.o
Утилита >make
автоматически создала объектные файлы и скомпоновала их. Попробуйте теперь внести какое-нибудь простейшее изменение в файл >main.c
и снова запустить утилиту. Вот что произойдет:
>% make
>gcc -с main.c
>g++ -о reciprocal main.o reciprocal.o
Как видите, утилита >make
повторно создала файл >main.o
и перекомпоновала программу, но не стала перекомпилировать файл >reciprocal.cpp
, так как в этом не было необходимости.
Запись >$(CFLAGS)
обозначает переменную утилиты make. Ее можно определить либо в файле >Makefile
, либо в командной строке. Утилита подставит на место переменной реальное значение во время выполнения правила. Вот как, например, можно осуществить перекомпиляцию с включённой оптимизацией:
>% make clean
>rm -f *.o reciprocal
>% make CFLAGS=-O2
>gcc -O2 -c main.c
>g++ -O2 -c reciprocal.cpp
>g++ -O2 -o reciprocal main.o reciprocal.o
Обратите внимание на то, что вместо записи >$(CFLAGS)
в правилах появился флаг >-O2
.
В этом разделе мы рассмотрели лишь самые основные возможности утилиты