Command line Makefile命令行参数未解析

Command line Makefile命令行参数未解析,command-line,makefile,Command Line,Makefile,我的makefile如下所示: CC = gcc CFLAGS = -g3 LIBS = `pkg-config --cflags --libs glib-2.0` BINDIR = bin OUTOBJ = $(addprefix $(BINDIR)/, main.o) $(info INCLUDE_PATH:$(INCLUDE_PATH)) $(BINDIR)/%.o : %.c $(CC) -c $< $(CFLAGS) -o $@ $(LIBS

我的makefile如下所示:

CC = gcc
CFLAGS = -g3
LIBS = `pkg-config --cflags --libs glib-2.0`
BINDIR = bin
OUTOBJ = $(addprefix $(BINDIR)/, main.o) 
$(info INCLUDE_PATH:$(INCLUDE_PATH))

$(BINDIR)/%.o : %.c 
                $(CC) -c $< $(CFLAGS) -o $@ $(LIBS)

# TODO: Merge with above rule
$(BINDIR)/%.o : */%.c 
                $(CC) -c $(INCLUDE_PATH) $< $(CFLAGS) -o $@ $(LIBS)


all: $(OUTOBJ)

$(OUTOBJ): | $(BINDIR)

$(BINDIR):
            mkdir $(BINDIR)

.PHONY : clean
clean:
        rm bin/*
make INCLUDE_PATH="/my/proj/dir"
INCLUDE_PATH:/my/proj/dir
gcc -c main.c -g3 -o bin/main.o `pkg-config --cflags --libs glib-2.0`

.....
.....
我得到如下输出:

CC = gcc
CFLAGS = -g3
LIBS = `pkg-config --cflags --libs glib-2.0`
BINDIR = bin
OUTOBJ = $(addprefix $(BINDIR)/, main.o) 
$(info INCLUDE_PATH:$(INCLUDE_PATH))

$(BINDIR)/%.o : %.c 
                $(CC) -c $< $(CFLAGS) -o $@ $(LIBS)

# TODO: Merge with above rule
$(BINDIR)/%.o : */%.c 
                $(CC) -c $(INCLUDE_PATH) $< $(CFLAGS) -o $@ $(LIBS)


all: $(OUTOBJ)

$(OUTOBJ): | $(BINDIR)

$(BINDIR):
            mkdir $(BINDIR)

.PHONY : clean
clean:
        rm bin/*
make INCLUDE_PATH="/my/proj/dir"
INCLUDE_PATH:/my/proj/dir
gcc -c main.c -g3 -o bin/main.o `pkg-config --cflags --libs glib-2.0`

.....
.....
因此,从输出来看,文件开头的$(info INCLUDE_PATH:$(INCLUDE_PATH))语句基本上可以很好地解析,但在task$(INCLUDE_PATH)变量内部无法解析。有人能帮我吗

因此,从输出来看,文件开头的$(info INCLUDE_PATH:$(INCLUDE_PATH))语句基本上可以很好地解析,但在task$(INCLUDE_PATH)变量内部无法解析

不,根本不是这样。正如@G.M.在注释中所观察到的,在
$(BINDIR)
中构建对象文件有两种不同的模式规则,并且它们在食谱是否引用
$(INCLUDE_PATH)
方面有所不同。您提供的输出与应用的第一个而不是第二个一致。这正是我所期望的,因为第二条规则中的先决条件模式,
*/%.c
,与实际使用的先决条件,
main.c
,其名称不包含
/
字符,不匹配

对于示例makefile,您可以用此规则替换
$(BINDIR)/%.o
规则

$(BINDIR)/%.o : %.c 
        $(CC) -c -I$(INCLUDE_PATH) $(CFLAGS) -o $@ $< $(LIBS)
生成的规则非常类似于
make
的内置规则,用于从单个对应的源文件构建对象文件


一般来说,我不太喜欢在与其对应的源不同的目录中构建对象,因为这与粒度不符,因此需要更多的工作来设置,而且要复杂得多。不管你真正的项目是大还是小,我真的不明白这项努力是如何合理的。如果你想要源代码之外的版本,那么就一直使用。

你能试试
$(CC)-c$(CFLAGS)$(INCLUDE\u PATH)$<-o$@$(LIBS)
和/或
$(CC)$(CFLAGS)-c$(INCLUDE\u PATH)$<-o$@$(LIBS)
?为什么你认为这两条规则中的第二条规则要生成
$(BINDIR呢/%.o
正在使用?@G.M.感谢您指出。现在通过使用VPATH解决了这一问题。我不再需要使用两种不同的捕获规则。就是这样!现在回想起来,这是一个相当愚蠢的问题。但是谢谢你提出的所有有趣的观点。我会看看VPATH;但我确实想转储bin/I中的所有.o文件,我还能够合并VPATH并摆脱在多个子目录中捕获%.c的多个规则。真的很有帮助!