如何使用Makefile编译具有不同CFLAG的不同c文件?

如何使用Makefile编译具有不同CFLAG的不同c文件?,makefile,Makefile,全部。假设我有一个包含一长串C源文件的程序,a.C,B.C,…,Z.C,现在我想用某些CFLAGS编译a.C,B.C,用不同的CFLAGS值编译源文件的其余部分 如何编写Makefile来完成上述工作?目前我在Makefile中所做的是: OBJ=[all other .o files here, e.g. D.o, D.o, E.o .... Z.o] SPECIAL_OBJS=A.o B.o all: $(OBJ) $(SPECIAL_OBJS) $(SPECIAL_OBJS):

全部。假设我有一个包含一长串C源文件的程序,a.C,B.C,…,Z.C,现在我想用某些CFLAGS编译a.C,B.C,用不同的CFLAGS值编译源文件的其余部分

如何编写Makefile来完成上述工作?目前我在Makefile中所做的是:

OBJ=[all other .o files here, e.g. D.o, D.o, E.o .... Z.o]
SPECIAL_OBJS=A.o B.o

all: $(OBJ) $(SPECIAL_OBJS)

$(SPECIAL_OBJS): 
     @echo [Compiling]: $(@:.o=.c)
     $(CC) [SOME OTHER GCC OPTIONS HERE] $(CFLAGS) -c $(@:.o=.c) -o $@

%.o: %.c
     @echo [Compiling]: $<
     $(CC) $(CFLAGS) -o $@ -c $<
OBJ=[此处的所有其他.o文件,例如D.o、D.o、e.o….Z.o]
特殊对象=A.o B.o
全部:$(OBJ)$(特殊对象)
$(特殊对象):
@echo[编译]:$(@:.o=.c)
$(CC)[此处的一些其他GCC选项]$(CFLAGS)-c$(@:.o=.c)-o$@
%.o:%.c
@echo[编译]:$<
$(CC)$(CFLAGS)-o$@-c$<

它可以工作,但看起来很愚蠢/复杂。有人能帮忙指出在Makefile中推荐的方法是什么吗?谢谢

我无法回答原始makefiles的问题,但如果您愿意使用automake,它就很简单了:

foo_CFLAGS = [options passed to CC only when building foo] foo_CFLAGS=[仅在构建foo时才传递给CC的选项]
尝试使用特定于目标的变量。特定于目标的变量声明如下:

TARGET: VAR := foo  # Any valid form of assignment may be used ( =, :=, +=, ?=)
现在,当创建名为target的目标时,名为VAR的变量将具有值“foo”

使用特定于目标的变量,您可以这样做,例如:

OBJ=[all other .o files here, e.g. D.o, D.o, E.o .... Z.o]
SPECIAL_OBJS=A.o B.o

all: $(OBJ) $(SPECIAL_OBJS)

$(SPECIAL_OBJS): EXTRA_FLAGS := -std=c99   # Whatever extra flags you need

%.o: %.c
     @echo [Compiling]: $<
     $(CC) $(CFLAGS) $(EXTRA_FLAGS) -o $@ -c $<
OBJ=[此处的所有其他.o文件,例如D.o、D.o、e.o….Z.o]
特殊对象=A.o B.o
全部:$(OBJ)$(特殊对象)
$(特殊对象):额外标志:=-std=c99#您需要的任何额外标志
%.o:%.c
@echo[编译]:$<
$(CC)$(CFLAGS)$(额外标志)-o$@-c$<

linux内核构建系统采用的方法:

CFLAGS += $(CFLAGS-$@)
然后呢,

CFLAGS-A.o += -DEXTRA
CFLAGS-B.o += -DEXTRA

当像这样使用automake时,“foo”可以是任何类型的目标(例如对象文件),还是必须是最终目标(可执行文件或库)?像这样使用原色适用于最终目标和所有中间目标。要仅应用于中间目标(例如.o文件),可以将显式规则写入Makefile.amIf如果不想重新定义默认的.c->.o编译规则,
CFLAGS+=$(额外的CFLAGS)
也可以工作(至少对于GNU make是这样)。直接附加到CFLAGS似乎也可以工作:
$(特殊的OBJS):CFLAGS+=-std=c99
(再次GNU make)。@sstn如上所述,可以使用任何有效的赋值形式。抱歉,跳过了这一部分。值得注意的是,这里的额外信息--特定于目标的变量具有“特殊功能”,它们也应用于目标的依赖关系规则,除非被所述依赖关系覆盖。基于“特殊功能”的措辞,假设Mykyta所展示的Linux内核使用的方法不能做到这一点,那么可能会有一些情况(我无法想象)同时拥有这两个选项是很好的。这是Posix Make还是GNU Make?