порядок зависимостей в make - PullRequest
1 голос
/ 29 декабря 2011

Поскольку сказано, что порядок зависимостей имеет значение в make-файле.Я хотел бы понять, как:

finalObjectFile: x.o main.o y.o
    g++ x.o main.o y.o -o finalObjectFile

main.o: header/x.h source/main.cpp
    g++ -c source/main.cpp

x.o: header/x.h source/x.cpp
    g++ -c source/x.cpp

y.o: source/y.cpp header/x.h
    g++ -c source/y.cpp

В приведенном выше коде я поменял местами заголовочный файл xh:

x.o: header/x.h source/x.cpp
        g++ -c source/x.cpp

y.o: source/y.cpp header/x.h
        g++ -c source/y.cpp

, но вывод не осуществляется!

Какие виды зависимостей на самом деле важны для порядка?

Ответы [ 2 ]

3 голосов
/ 29 декабря 2011

В показанном контексте нет существенной разницы между заголовком перед источником и источником перед заголовком . Правила говорят (например):

  • x.o должно быть более новым, чем header/x.h и source/x.cpp.

Неважно, в какой последовательности появляются эти две зависимости; если какая-либо зависимость новее, чем x.o, команда будет выполнена.

Когда имеет значение заказ? Это немного хитрее, но это может быть важным фактором, если у вас есть несколько промежуточных файлов, которые генерируются по ходу работы. Это может быть особенно проблемой, если некоторые из выполняемых вами команд влияют на несколько файлов, но вы не сообщаете make обо всех этих взаимодействиях.

Однако порядок зависимости обычно не является проблемой.

2 голосов
/ 29 декабря 2011

Это имеет значение в реальных файлах make, потому что вы склонны использовать упакованные правила.Как правило, $< заменяется обязательным условием first .Таким образом:

compile = g++ -c $< -o $@

x.o : source/x.cpp header/x.h
    $(compile)

y.o : header/y.h source/y.cpp
    $(compile)

Первое правило будет компилировать source/x.cpp, как требуется.Второе правило будет пытаться скомпилировать header/y.h, что определенно не то, что нужно.

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

В другом случае это может иметь значение (но это не должно иметь место в хорошо написанном make-файле): во многих случаях make разрешит зависимости слева отправильный порядок;т.е. дано:

x.o : source/x.cpp header/x1.h header/x2.h
    ...

make сначала проверит, что source/x.cpp обновлено, и построит его при необходимости, а затем сделает то же самое для header/x1.h и header/x2.h, в этом порядке,Если у вас есть какие-либо необъявленные зависимости, которые требуют построения header/x1.h до header/x2.h, то изменение их порядка также вызовет проблемы.Это, однако, ошибка в make-файле;зависимость должна быть сделана явной (например, правило с header/x1.h : header/x2.h).Потому что этот порядок не гарантируется иначе;например, в случае GNU make это может быть нарушено, если вы используете опцию -j.header/x.h, тогда замена заказа может вызвать проблемы.

...