Целевые модули перечислены слева. За именем модуля следует двоеточие и существующие зависимости. В следующей строке указано правило, по которому создается модуль (назначение записи
$(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
.
В этом разделе мы рассмотрели лишь самые основные возможности утилиты
make
. Чтобы получить о ней более подробную информацию, обратитесь к интерактивной документации, введя такую команду:
% info make
В документации можно найти полезные сведения о том, как упростить управление файлом
Makefile
, уменьшить число необходимых правил и автоматически вычислять зависимости.
1.4. GNU-отладчик gdb
Отладчик — это программа, с помощью которой можно узнать, почему написанная вами программа ведет себя не так, как было задумано. Работать с отладчиком приходится очень часто. Большинство Linux-программистов имеет дело с GNU-отладчиком (GNU Debugger, GDB), который позволяет пошагово выполнять программу, создавать точки останова и проверять значения локальных переменных.
1.4.1. Компиляция с включением отладочной информации
Чтобы можно было воспользоваться GNU-отладчиком, необходимо скомпилировать программу с включением в нее отладочной информации. Этой цели служит опция
– g
компилятора. Если имеется описанный выше файл Makefile, достаточно задать переменную
CFLAGS
равной
– g
при запуске утилиты
make
:
% make CFLAGS=-g
gcc -g -с main.c
g++ -g -c reciprocal.cpp
g++ -g -о reciprocal main.o reciprocal.o
Встречая в командной строке флаг
– g
, компилятор включает дополнительную информацию в объектные и исполняемые файлы. Благодаря этой информации отладчик узнает, какие адреса соответствуют тем или иным строкам в том или ином исходном файле, как отобразить значение локальной переменной, и т.д.
1.4.2. Запуск отладчика
Отладчик
gdb
запускается следующим образом:
% gdb reciprocal
После запуска появится строка приглашения такого вида:
(gdb)
В первую очередь необходимо запустить программу под отладчиком. Для этого введите команду
run
и требуемые аргументы. Попробуем вызвать программу без аргументов:
(gdb) run
Starting program: reciprocal
Program received signal SIGSEGV, Segmentation fault.
не предусмотрены средства контроля ошибок. Программа ожидает наличия аргумента, а в данном случае его нет. Получение сигнала
SIGSEGV
означает крах программы. Отладчик определяет, что причина краха находится в функции
__strtol_internal
. Эта функция является частью стандартной библиотеки, но ее исходный файл отсутствует. Вот почему появляется сообщение "No such file or directory". С помощью команды