make: gcc: Команда не найдена с помощью include в make-файле - PullRequest
0 голосов
/ 09 октября 2018

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

Global makefile:

CC          = gcc
CFLAGS      = -W -Wall -pedantic
LDFLAGS     =

PROJECT     = proj

SOURCES     =

PATH        = $(PROJECT)
include $(PATH)/Makefile

all : $(PROJECT).exe

$(PROJECT).exe :
  $(CC) $(CFLAGS) $(LDFLAGS) $(DEFINES) $(INCLUDES) $(SOURCES) -o $@

clean :
  rm -rf *.exe

Makefile подкаталога:

CC          = gcc
CFLAGS      = -W -Wall -pedantic
LDFLAGS     = 

SOURCES     += $(PATH)/main.c

Когда я "делаю" в верхнем каталоге, у меня появляется следующая ошибка:

gcc -W -Wall -pedantic     proj/main.c -o proj.exe
make: gcc: Command not found
make: *** [Makefile:17: FK16_jake.exe] Error 127

Но когда я набираю точно такую ​​же команду (gcc -W -Wall -pedantic proj /main.c -o proj.exe) в моем терминале, он строит.

И если я удаляю make-файл include, он распознает gcc, но не строит, потому что нет исходников (нормальное поведение).

Ответы [ 2 ]

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

В оболочке UNIX переменная среды PATH задает набор каталогов для поиска исполняемых файлов при запуске команды.

В руководстве GNU Make написано:

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

Поскольку PATH является переменной оболочки и определена в среде make, она"пришел из окружающей среды".Это означает, что когда вы изменяете значение с помощью PATH = $(PROJECT), обновленное значение будет установлено в среде оболочки, которая запускает рецепт для $(PROJECT).exe.Это означает, что оболочка работает с неверным значением для PATH и поэтому не может найти gcc.

Чтобы избежать этой путаницы, не используйте PATH в качестве переменной makefile.Используйте другое имя, которое не совпадает с переменной окружения, от которой зависит оболочка.Вы можете назвать это PROJECT_PATH вместо этого или просто использовать $(PROJECT) вместо $(PATH).

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

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

...