【问题标题】:How to compile different c files with different CFLAGS using Makefile?如何使用 Makefile 编译具有不同 CFLAGS 的不同 c 文件?
【发布时间】:2010-11-21 07:08:19
【问题描述】:

全部。假设我有一个包含一长串 C 源文件 Ac、Bc、....、Zc 的程序,现在我想用某些 CFLAGS 编译 Ac、Bc,并用不同的编译源文件的其余部分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 $<

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

【问题讨论】:

  • 这是 Posix Make 还是 GNU Make?

标签: makefile


【解决方案1】:

我无法回答有关原始 makefile 的问题,但如果您愿意使用 automake,这很简单:

foo_CFLAGS = [仅在构建 foo 时传递给 CC 的选项]

【讨论】:

  • 当像这样使用 automake 时,“foo”可以是任何类型的目标(例如目标文件),还是必须是最终目标(可执行文件或库)?
  • 使用这样的初选适用于最终目标和所有中间目标。要仅应用于中间目标(例如 .o 文件),您可以将显式规则写入 Makefile.am
【解决方案2】:

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

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 $<

【讨论】:

  • 如果你不想重新定义默认的 .c -> .o 编译规则,CFLAGS+=$(EXTRA_CFLAGS) 也可以(至少对于 GNU make)。
  • 直接附加到 CFLAGS 似乎也可以:$(SPECIAL_OBJS): CFLAGS+=-std=c99(GNU make 再次)。
  • @sstn 如上所述,可以使用任何有效的赋值形式。
  • 抱歉,跳过了。
  • 值得注意的是这里的额外信息 - stackoverflow.com/a/978065/2757035 - 特定于目标的变量具有“特殊功能”,它们也适用于其目标依赖项的规则,除非被所述依赖项覆盖.假设,基于“特殊功能”的措辞,Mykyta 所示的 Linux 内核使用的方法没有做到这一点 - 那么可能有一些情况(我无法想象)同时拥有这两种选择是很好的。
【解决方案3】:

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

CFLAGS += $(CFLAGS-$@)

然后,

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多