C MakeFile-传递目标时避免使用某些文件

C MakeFile-传递目标时避免使用某些文件,c,makefile,C,Makefile,我试图创建一个目标,避免某些c文件。我这样做是因为某些文件不兼容,希望在构建过程中避免它们。下面是我正在使用的方法,但在这样做时遇到了麻烦。警告:覆盖目标的命令…。我确实理解错误的原因,但不知道更好的解决方法。请引导我,我对makefile是新手。提前谢谢 SRCDIR = ../src BUILDDIR = build INCDIR = ../inc # Compiler to use CC = gcc # Include paths for header files INCLUDES =

我试图创建一个目标,避免某些c文件。我这样做是因为某些文件不兼容,希望在构建过程中避免它们。下面是我正在使用的方法,但在这样做时遇到了麻烦。
警告:覆盖目标的命令…
。我确实理解错误的原因,但不知道更好的解决方法。请引导我,我对makefile是新手。提前谢谢

SRCDIR = ../src
BUILDDIR = build
INCDIR = ../inc

# Compiler to use
CC = gcc

# Include paths for header files
INCLUDES = -I $(INCDIR)

# Compiler flags
# WARNING: Optimization will remove critical code (Problems seen in delay function). Use with caution.
CFLAGS = -Wall -Wextra -g $(INCLUDES) --std=gnu99
CFLAGSNOWARN = -g $(INCLUDES) --std=gnu99

# extra gcc flags used to build dependency files
DEPFLAGS = -MMD -MP

# Paths to required libraries (-L flags)
LFLAGS =

# The specific libraries that project depends on (-l flags)
LIBS = -lreadline -lpthread

# All source files
SRCS = $(wildcard $(SRCDIR)/*.c)
SRCS_1 = $(filter-out $(SRCDIR)/FileToAvoid.c, $(wildcard $(SRCDIR)/*.c))

# All object files
OBJS := $(SRCS:$(SRCDIR)/%.c=%.o)
OBJS_1 := $(SRCS_1:$(SRCDIR)/%.c=%.o)

# name of executable
MAIN = test.exe

# make all
.PHONY: all

# this is the default target
## create temporary .o files and compile main executable
all: $(MAIN)

avoidfile: $(OBJS_1)
    @echo "Compiling executable: $(MAIN)"
    @$(CC) $(CFLAGS) -o $(MAIN) $(OBJS_1) $(LFLAGS) $(LIBS)
    @echo

$(MAIN): $(OBJS)
    @echo "Compiling executable: $(MAIN)"
    @$(CC) $(CFLAGS) -o $(MAIN) $(OBJS) $(LFLAGS) $(LIBS)
    @echo

# Automatically builds all object files from source files
# -c option compiles but does not link (create object files)
# -o is output filename
$(OBJS): %.o : $(SRCDIR)/%.c
    @echo "Compiling object file: $@"
    @$(CC) $(CFLAGS) $(DEPFLAGS) -c $< -o $@
    @echo

$(OBJS_1): %.o : $(SRCDIR)/%.c 
    @echo "Compiling object fileslean: $@"
    @$(CC) $(CFLAGS) $(DEPFLAGS) -c $< -o $@
    @echo
SRCDIR=../src
BUILDDIR=build
INCDIR=../inc
#要使用的编译器
CC=gcc
#包括头文件的路径
包括=-I$(INCDIR)
#编译器标志
#警告:优化将删除关键代码(延迟功能中出现的问题)。小心使用。
CFLAGS=-Wall-Wextra-g$(包括)--std=gnu99
CFLAGSNOWARN=-g$(包括)--std=gnu99
#用于构建依赖项文件的额外gcc标志
DEPFLAGS=-MMD-MP
#所需库的路径(-L标志)
LFLAGS=
#项目所依赖的特定库(-l标志)
LIBS=-lreadline-lpthread
#所有源文件
SRCS=$(通配符$(SRCDIR)/*.c)
SRCS_1=$(过滤掉$(SRCDIR)/FileToAvoid.c,$(通配符$(SRCDIR)/*.c))
#所有对象文件
OBJS:=$(SRCS:$(SRCDIR)/%.c=%.o)
OBJS_1:=$(SRCS_1:$(SRCDIR)/%.c=%.o)
#可执行文件的名称
MAIN=test.exe
#全部
冒牌货:全部
#这是默认目标
##创建临时.o文件并编译主可执行文件
全部:$(主)
avoidfile:$(对象1)
@echo“编译可执行文件:$(主)”
@$(CC)$(CFLAGS)-o$(MAIN)$(OBJS_1)$(LFLAGS)$(LIBS)
@回音
$(主):$(OBJS)
@echo“编译可执行文件:$(主)”
@$(CC)$(CFLAGS)-o$(MAIN)$(OBJS)$(LFLAGS)$(LIBS)
@回音
#从源文件自动生成所有对象文件
#-c选项编译但不链接(创建对象文件)
#-o是输出文件名
$(OBJS):%.o:$(SRCDIR)/%.c
@echo“编译对象文件:$@”
@$(CC)$(CFLAGS)$(DEPFLAGS)-c$<-o$@
@回音
$(OBJS_1):%.o:$(SRCDIR)/%.c
@echo“编译对象文件精简:$@”
@$(CC)$(CFLAGS)$(DEPFLAGS)-c$<-o$@
@回音

由于要编译的两条规则是相等的,因此可以创建一条规则:

$(sort $(OBJS) $(OBJS_1)): %.o : $(SRCDIR)/%.c 
    echo "Compiling object file: $@"
    $(CC) $(CFLAGS) $(DEPFLAGS) -c $< -o $@
$(sort$(OBJS)$(OBJS_1)):%.o:$(SRCDIR)/%.c
echo“编译对象文件:$@”
$(CC)$(CFLAGS)$(DEPFLAGS)-c$<-o$@
sort
功能可删除重复项,即使您不关心排序,也建议您使用此功能


您可能认为双冒号规则可能会有所帮助,但请注意!这些操作的方法都已执行,导致对相同源的多个编译。

沉默操作符是一种反模式,它会抑制任何调试工作。先把它们拿出来(然后可能永远不会放回去。如果你不想看到你在做什么,请使用
make-s
。@RahulGupta,OBJS_1是OBJS的子集,它的内容不需要有静态模式规则。在
OBJS
OBJS_1
变量中不能有相同的文件。您应该有一个要避免的所有文件的列表,另一个列表是除要避免的文件列表之外的所有文件。@没有该静态模式的程序员不确定可以采取什么其他方法。我使用一个make文件在单独的板上构建,例如
makeboard1
makeboard2
。取决于它是哪个板,它将排除某些文件。@RahulGupta,您是否考虑过使用模式规则而不是静态模式规则?换句话说,删除
$(OBJS):
并仅使用
%.o:$(SRCDIR)/%.c
@thebusbee感谢您的响应。但现在它在同一规则中多次抛出给定的