Makefile, лучшее понимание правил - PullRequest
0 голосов
/ 03 октября 2018

Чтение официальной документации

Обязательным условием является файл, который используется в качестве входных данных для создания цели.Цель часто зависит от нескольких файлов.

Если мой исходный файл уже содержит заголовок, должен ли я перечислить заголовок в правиле?

src.c

#include <stdio.h>
#include "myheader.h"

int main()
{
    printMessage();
    return 0;
}

myheader.h

void printMessage()
{
    printf("a message to screen\n");
}

makefile

src : src.o
    cc -o src src.o

src.o : src.c
    cc -c src.c

Если я добавлю myheader.h в предварительное условие, оно ничего не изменит, то же сообщение будет выведено на экран.Если заголовок включен явно, должен ли он появиться в предварительном условии?

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Заголовочный файл должен быть включен в список зависимостей.

При первом использовании make для сборки программы он будет скомпилирован точно так же, независимо от того, включите ли вы myheader.h в качестве зависимости или нет,Разница в том, что происходит, когда один из файлов изменяется.

Если вы снова запустите make, ничего не меняя, он скажет, что «src» обновлен и ничего не скомпилирует.Однако если вы изменили myheader.h, а не включили его в качестве зависимости, то make скажет, что цель обновлена.Он не смотрит на исходный файл, чтобы увидеть, какие файлы он включает.Утилита make ничего не знает о исходном коде на C или C ++ (или любом другом исходном коде).Он смотрит только на наличие изменений в указанных файлах, не просматривая их содержимое.

Если вы включите myheader.h в качестве зависимости, если вы позже измените этот файл, тогда запуск make будетперестройте программу.

Если вы хотите знать все несистемные заголовочные файлы, от которых зависит данный исходный файл, вы можете запустить gcc с опцией -MM.Это выведет правило make со списком зависимостей заголовка исходного файла.

Например, если вы запустите gcc -MM src.c, вы получите следующий вывод:

src.o: src.c myheader.h

Вы можетезатем включите это в свой make-файл.

0 голосов
/ 03 октября 2018

Да, вам следует.

Программа make использует список файлов, чтобы выяснить, изменилась ли зависимость, и в результате цель должна быть перестроена.Вам нужно явно указать эту зависимость.

Он не видит включение, он видит только те правила, которые вы указали.Так что есть теоретическая возможность, что вы измените заголовок таким образом, что может потребоваться повторная компиляция src.o, но make не узнает, что вы сделали это, если вы не скажете ему остерегаться.

...