Команда GNU make часто вызывает себя многократно для больших пакетов, и каждый ее экземпляр отмечен в сообщениях об ошибках с помощью символов [
[compiler error message involving file.c]
make[3]: *** [file.o] Error 1
make[3]: Leaving directory '/home/src/package-5.0/src'
make[2]: *** [all] Error 2
make[2]: Leaving directory '/home/src/package-5.0/src'
make[1]: *** [all-recursive] Error 1 make[1]: Leaving directory '/home/src/package-5.0/'
make: *** [all] Error 2
Первые три строки практически выдают ее: проблема связана с файлом file.c, который расположен в каталоге /home/src/package-5.0/src. К сожалению, дополнительной информации так много, что бывает сложно найти важные детали. Выяснение того, как отфильтровать более поздние ошибки утилиты make, позволит отыскать настоящую причину.
Особые ошибки. Вот несколько распространенных ошибок сборки, которые могут вам встретиться.
Ошибка
Сообщение об ошибке компилятора:
src.c:22: conflicting types for 'item'
/usr/include/file.h:47: previous declaration of 'item'
Объяснение и устранение
Программист выполнил ошибочное повторное объявление элемента
Ошибка
Сообщение об ошибке компилятора:
src.c:37: 'time_t' undeclared (first use this function)
—
src.c:37: parse error before '...'
Объяснение и устранение
Программист забыл важный заголовочный файл. Страницы руководства лучше всего помогут в отыскании упущенного файла. Сначала посмотрите на ошибочную строку (в данном случае это строка 37 в файле src.c). Вероятно, она содержит объявление переменной вроде следующего:
time_t v1;
Отыщите в программе строку, в которой переменная v1 использует вызов какой-либо функции. Например, так:
v1 = time(NULL);
Теперь запустите команды man 2 time или man 3 time, чтобы отыскать системные и библиотечные вызовы с именем time. В данном случае подходит второй раздел страницы руководства:
SYNOPSIS
#include time.h
time_t time(time_t *t);
Это означает, что вызову time необходим файл time.h. Поместите строку #include time.h в начало файла src.c и попробуйте еще раз.
Ошибка
Сообщение об ошибке компилятора (препроцессора):
src.c:4: pkg.h: No such file or directory
(long list of errors follows)
Объяснение и устранение
Компилятор запустил препроцессор C для файла src.c, но не смог найти включаемый файл pkg.h. Исходный код, вероятно, зависит от библиотеки, которую необходимо установить, или же необходимо указать для компилятора нестандартный путь с включаемыми файлами. Как правило, вам понадобится лишь добавить параметр -I к флагам препроцессора C (CPPFLAGS), чтобы добавить этот путь. Помните о том, что может также понадобиться флаг компоновщика -L, чтобы использовать эти включаемые файлы.
Если ситуация не похожа на отсутствие библиотеки, есть незначительная вероятность того, что вы пытаетесь скомпилировать файл для операционной системы, которая не поддерживается данным исходным кодом. Ознакомьтесь с файлами Makefile и README, чтобы узнать подробности о платформах.
Если вы работаете с версией ОС на основе Debian, попробуйте применить команду apt-file к имени заголовочного файла:
$ apt-file search
Это может выявить необходимый пакет разработки. Для версий, которые содержат утилиту yum, попробуйте такой вариант:
$ yum provides */
Ошибка
Сообщение утилиты make:
make: prog: Command not found
Объяснение и устранение
Чтобы собрать пакет, в вашей системе должна быть программа
В редких случаях команда make собирает программу
16.7. Заглядывая вперед
Мы только затронули основы сборки программного обеспечения. Вот несколько дополнительных направлений, которые вы можете исследовать, когда займетесь собственными разработками.
• Понимание того, как использовать другие системы компоновки, кроме утилиты Autoconf (например, CMake и SCons).