Основная идея утилиты 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