make:gcc:在makefile中找不到包含的命令

时间:2018-10-09 12:32:23

标签: gcc makefile

我正在尝试创建一个Makefile体系结构,因此我在顶部有一个全局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

当我在顶层目录中“ make”时,出现以下错误:

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)时,它正在构建。

如果我删除包含的makefile,他会识别出gcc,但由于没有源(正常行为)而无法构建。

2 个答案:

答案 0 :(得分:3)

您正在覆盖PATH,该路径用于确定在何处查找可执行文件。更改此变量,它应该起作用。

答案 1 :(得分:1)

在UNIX shell中,environment variable PATH指定在运行命令时要搜索可执行文件的目录集。

GNU Make manual说:

  

make运行配方时,makefile中定义的变量为   放入每个外壳的环境中。这可以让您通过   子make调用的值(请参见Recursive Use of make)。默认情况下,仅来自环境的变量   或命令行传递给递归调用。

由于PATH是一个shell变量,并且在make的环境中定义,因此它是“来自环境”。这意味着当您使用PATH = $(PROJECT)修改值时,更新的值将在运行$(PROJECT).exe的配方的外壳环境中设置。这意味着外壳程序以PATH的错误值运行,因此找不到gcc

为避免这种混乱,请勿将PATH用作makefile变量。使用另一个名称,该名称与Shell依赖的环境变量不同。您可以改用PROJECT_PATH,也可以用$(PROJECT)代替$(PATH)