如何使用Makefile编译不同CFLAGS的不同c文件?

36 makefile

所有.比方说,我有一个包含的C源文件,AC,BC,...,ZC,现在我想要编译AC,BC与某些CFLAGS,并用不同的编译源文件的剩余部分很长的列表中的程序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 $<
Run Code Online (Sandbox Code Playgroud)

它有效,但看起来很愚蠢/复杂.任何人都可以帮助指出在Makefile中这样做的推荐方法是什么?谢谢!

Dan*_*ing 48

尝试使用特定于目标的变量.特定于目标的变量声明如下:

TARGET: VAR := foo  # Any valid form of assignment may be used ( =, :=, +=, ?=)
Run Code Online (Sandbox Code Playgroud)

现在,当创建名为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 $<
Run Code Online (Sandbox Code Playgroud)

  • 如果你不想重新定义默认的.c - > .o编译规则,`CFLAGS + = $(EXTRA_CFLAGS)`也可以工作(至少对于GNU make). (3认同)

小智 13

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

CFLAGS += $(CFLAGS-$@)
Run Code Online (Sandbox Code Playgroud)

然后,

CFLAGS-A.o += -DEXTRA
CFLAGS-B.o += -DEXTRA
Run Code Online (Sandbox Code Playgroud)