我正在尝试创建一个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,但由于没有源(正常行为)而无法构建。
答案 0 :(得分:3)
您正在覆盖PATH,该路径用于确定在何处查找可执行文件。更改此变量,它应该起作用。
答案 1 :(得分:1)
在UNIX shell中,environment variable PATH
指定在运行命令时要搜索可执行文件的目录集。
make
运行配方时,makefile中定义的变量为 放入每个外壳的环境中。这可以让您通过 子make
调用的值(请参见Recursive Use ofmake
)。默认情况下,仅来自环境的变量 或命令行传递给递归调用。
由于PATH
是一个shell变量,并且在make
的环境中定义,因此它是“来自环境”。这意味着当您使用PATH = $(PROJECT)
修改值时,更新的值将在运行$(PROJECT).exe
的配方的外壳环境中设置。这意味着外壳程序以PATH
的错误值运行,因此找不到gcc
。
为避免这种混乱,请勿将PATH
用作makefile变量。使用另一个名称,该名称与Shell依赖的环境变量不同。您可以改用PROJECT_PATH
,也可以用$(PROJECT)
代替$(PATH)
。