Компилятор оптимизирует порядок компиляции файлов в файле makefile с целевой функцией? [Дубликат]

Скорее всего, вы перепутались с переменной PATH. Возможно, вы переписываете его где-то еще в своем скрипте. Поскольку sort является внешней командой, противоположной всем остальным в вашей командной строке, например for, dir, rd, которые являются cmd - внутренними командами, переменная PATH необходима для поиска команда. Если PATH не определен, внешние команды выполняются только в текущем рабочем каталоге. Существует также переменная PATHEXT, необходимая для определения стандартных расширений файлов для исполняемых файлов, таких как .com, .exe. Поэтому, когда sort появляется в командной строке или в пакетном файле, система ищет текущий рабочий каталог и все каталоги, указанные переменной PATH для файла с базовым именем sort и одним из расширений, указанных в PATHEXT. Команда sort на самом деле называется sort.exe и обычно находится в C:\Windows\System32.

22
задан Shailesh Tainwala 6 February 2012 в 14:16
поделиться

4 ответа

По умолчанию порядок выполнения совпадает с порядком выполнения, указанным в списке предварительных условий, если между этими предварительными условиями не существует каких-либо зависимостей.

abc: x y z

Порядок: x y z.

abc: x y z
y : z

Порядок будет x z y.

Но в идеале вы должны спроектировать свои файлы Makefile, чтобы он не опирался на порядок, в котором указаны необходимые условия. То есть, если y должно быть выполнено после z, должна быть зависимость y : z.

И имейте в виду, что GNU Make может выполнять некоторые рецепты параллельно, см. Mat's ответ .

29
ответ дан Lightness Races in Orbit 1 September 2018 в 02:02
поделиться

В описании POSIX make содержится обоснование, которое гласит:

Утилиты make в большинстве исторических реализаций обрабатывают предпосылки для цели в левом вправо, и для этого необходим формат файла makefile. Он поддерживает стандартную идиому, используемую во многих make-файлах, которые создают программы yacc; например:

foo: y.tab.o lex.o main.o
     $(CC) $(CFLAGS) -o $@ t.tab.o lex.o main.o

В этом примере, если make выбрал любой произвольный порядок, lex.o не может быть сделан с правильным y.tab.h. Хотя могут быть лучшие способы выразить эти отношения, он широко используется исторически. Реализации, которые хотят обновить предварительные требования параллельно, должны требовать явного расширения make или формата файла makefile, как описано ранее.

( Я считаю, что t.tab.o в строке $(CC) является опечаткой для y.tab.o, но это то, что на самом деле говорит логическое обоснование. )

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

15
ответ дан Jonathan Leffler 1 September 2018 в 02:02
поделиться

Из https://stackoverflow.com/a/22638294/636849 вы можете добавить символ трубы:

abc: | x y z

From make manual: Order - предварительные условия могут быть заданы путем размещения символа трубы (|) в списке предварительных условий: любые предпосылки слева от символа трубы являются нормальными; любые предварительные условия справа имеют только порядок:

цели: нормальные требования | только заказы-предпосылки

-1
ответ дан Lucas Cimon 1 September 2018 в 02:02
поделиться

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

Единственное жесткое правило заключается в том, что все предпосылки должны выполняться до запуска целевого рецепта.

Если между x, y и z нет зависимостей и нет параллельного выполнения, GNU make, похоже, запускает их в указанном вами порядке, но это не гарантируется в Docs.

31
ответ дан Mat 1 September 2018 в 02:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: