Основная идея утилиты make
В нашем тестовом проекте reciprocal
reciprocal.o
, main.o
и сама программа reciprocal
. Правила нам уже известны: это рассмотренные выше командные строки. А вот над зависимостями нужно немного подумать. Ясно, что файл reciprocal
зависит от файлов 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)
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
.В этом разделе мы рассмотрели лишь самые основные возможности утилиты make
% info make
В документации можно найти полезные сведения о том, как упростить управление файлом Makefile
1.4. GNU-отладчик gdb
1.4.1. Компиляция с включением отладочной информации
Чтобы можно было воспользоваться GNU-отладчиком, необходимо скомпилировать программу с включением в нее отладочной информации. Этой цели служит опция -g
CFLAGS
равной -g
при запуске утилиты make
:% make CFLAGS=-g
gcc -g -с main.c
g++ -g -c reciprocal.cpp
g++ -g -о reciprocal main.o reciprocal.o