';notdir';不';不能在Makefile中工作

';notdir';不';不能在Makefile中工作,makefile,Makefile,我有这样一个makefile: OBJ_FILES := $(addprefix $(OBJ_DIR)/, $(patsubst %.cc, %.o, $(SRC_FILES))) ... $(OBJ_FILES): %.o: src/$(notdir %.cc) $(CC) $< -o $@ $(CXXFLAGS) OBJ_文件:=$(addprefix$(OBJ_DIR)/,$(patsubst%.cc,%.o,$(SRC_文件))) ... $(对象文件):%.o:src/

我有这样一个makefile:

OBJ_FILES := $(addprefix $(OBJ_DIR)/, $(patsubst %.cc, %.o, $(SRC_FILES)))
...
$(OBJ_FILES): %.o: src/$(notdir %.cc)
    $(CC) $< -o $@ $(CXXFLAGS)
OBJ_文件:=$(addprefix$(OBJ_DIR)/,$(patsubst%.cc,%.o,$(SRC_文件)))
...
$(对象文件):%.o:src/$(notdir%.cc)
$(CC)$<-o$@$(CXXFLAGS)
$(SRC_文件)
a.cc
,而
$(OBJ_文件)
OBJ/a.o

但当我运行它时,我会得到错误信息:

make:**无规则生成目标src/obj/a.cc,obj/a.o需要。 停下来

所以我的问题是:为什么
$(notdir)
不提取文件名

试试这个:

OBJECTS = $(addprefix $(OBJ_DIR)/, $(patsubst %.cc,%.o, $(SRC_FILES)))
$(OBJDIR)/%.o: %.cc
$(CC) $(CFLAGS) $(CPPFLAGS) -c -o $@ $<  
OBJECTS=$(addprefix$(OBJ_DIR)/,$(patsubst%.cc,%.o,$(SRC_文件)))
$(OBJDIR)/%.o:%.cc
$(CC)$(CFLAGS)$(CPPFLAGS)-c-o$@$<

notdir
是在应用静态模式规则之前处理的,因此
$(notdir%.cc)
的结果实际上是
%.cc
,然后被规则替换以给出错误消息中的路径

以下内容应该可以使用,您也可以使用一些速记,请记住设置
CXX
而不是
CC

OBJ_FILES := $(SRC_FILES:src/%.cc=$(OBJ_DIR)/%.o)

$(OBJ_FILES): $(OBJ_DIR)/%.o: src/%.cc
    $(COMPILE.cc) $(OUTPUT_OPTION) $<
OBJ_文件:=$(SRC_文件:SRC/%.cc=$(OBJ_DIR)/%.o)
$(OBJ_文件):$(OBJ_目录)/%.o:src/%.cc
$(COMPILE.cc)$(输出选项)$<

谢谢!GNU make文档
10.5.4模式如何匹配
也谈到了这个问题:)