filter-out 不是过滤文件? C 的生成文件

filter-out is not filtering file? Makefile for C

所以我在这里得到了一个 make 文件,我的项目目前有一个 master.c 和 slave.c,它们都有主要功能。因此我只想从构建过程中过滤掉 slave.c 文件。所以我在定义源文件时使用了 fliter-out。但是当 运行 make 项目不断出现“multiple definitions of main”错误时。为什么过滤掉应该隐藏 slave.c 文件?

########################################################################
####################### Makefile Template ##############################
########################################################################

#Compiler settings - Can be customized.
CC = gcc
CXXFLAGS = -std=c11 -Wall
LDFLAGS =

# Makefile settings - Can be customized.
APPNAME = master
SUBAPPNAME = slave
EXT = .c
SRCDIR = .
OBJDIR = .

############## Do not change anything from here downwards! #############
SRC := $(filter-out slave.c, $(wildcard $(SRCDIR)/*$(EXT)))
OBJ := $(SRC:$(SRCDIR)/%$(EXT)=$(OBJDIR)/%.o)
DEP := $(OBJ:$(OBJDIR)/%.o=%.d)
#UNIX-based OS variables & settings
RM = rm
DELOBJ = $(OBJ)
# Windows OS variables & settings
DEL = del
EXE = .exe
WDELOBJ = $(SRC:$(SRCDIR)/%$(EXT)=$(OBJDIR)\%.o)

########################################################################
####################### Targets beginning here #########################
########################################################################

all: $(APPNAME)

# Builds the app
$(APPNAME): $(OBJ)
        $(CC) $(CXXFLAGS) -o $@ $^ $(LDFLAGS)

# Creates the dependecy rules
%.d: $(SRCDIR)/%$(EXT)
        @$(CPP) $(CFLAGS) $< -MM -MT $(@:%.d=$(OBJDIR)/%.o) >$@

# Includes all .h files
-include $(DEP)

# Building rule for .o files and its .c/.cpp in combination with all .h
$(OBJDIR)/%.o: $(SRCDIR)/%$(EXT)
        $(CC) $(CXXFLAGS) -o $@ -c $<

################### Cleaning rules for Unix-based OS ###################
# Cleans complete project
.PHONY: clean
clean:
        $(RM) $(DELOBJ) $(DEP) $(APPNAME)

# Cleans only all files with the extension .d
.PHONY: cleandep
cleandep:
        $(RM) $(DEP)

# Clean only all files with the extension .o
.PHONY: cleanobj
cleanobj:
        $(RM) $(DELOBJ)

# Cleans both files with .d and .o extensions
.PHONY: cleanod
cleanod:
        $(RM) $(DELOBJ) $(DEP)

来电

SRC := $(filter-out slave.c, $(wildcard $(SRCDIR)/*$(EXT)))

只是一个字符串操作,也就是说,make不知道底层文件树,并试图从中抛出字符串slave.c liste yoursrcdir/slave.c yoursrcdir/master.c 显然失败了。尽管一开始您可能不同意,但这是一件好事,因为文件树上的过滤器操作的语义绝不是通用的或易于记录或传输的。因此 make 只查看提供的字符串并决定 character-for-character 比较哪些要采用,哪些要丢弃。 也就是说,重写为

SRC := $(filter-out $(SRCDIR)/slave.c, $(wildcard $(SRCDIR)/*$(EXT)))

可以解决您的问题。 要获得更广泛的功能,请查看 abspathrealpath 这两个函数以获取规范格式的文件名,从而防止 filter et.al。从绊倒 OS 命名法的差异。