c - Makefile:两个不同的可执行文件,采用两个重叠的代码子集



这是我的情况,我正在尝试为我的c程序编写一个Makefile,它具有以下组件 -

  • 2 个标题:

    1. src/header1.h
    2. src/header2.h
  • N资料来源:

    1. src/src1.c
    2. src/src2.c
    3. src/src3.c......
    4. src/srcn.c
  • 2 主电源:

    1. src/main1.c
    2. src/main2.c

main1.cmain2.c 采用所有相同的src*.cheader*.h文件,但方式不同。如果我能用这种方式编写我的 Makefile,那就太好了——

CC          := gcc
INCLUDES    := $(wildcard src/*.h)
SRC1        := all src*.c sources and main1.c (not main2.c)
SRC2        := all src*.c sources and main2.c (not main1.c)
IFLAGS      := $(addprefix -I/,$(INCLUDES))
CFLAGS      := -g -Wall -pedantic -std=gnu99 $(IFLAGS)
LDFLAGS     := -lm 
OBJS1       := all objects from src*.c (i.e. src*.o) and main1.o
OBJS1       := all objects from src*.c (i.e. src*.o) and main2.o   
APP1        := app1
APP2        := app2
all: $(APP1) $(APP2)
$(APP1): $(OBJS1)
    $(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)
$(APP2): $(OBJS2)
    $(CC) $(CFLAGS) $^ -o $@ $(LDFLAGS)
$(OBJS1): $(SRC1)
    $(CC) $(CFLAGS) -o $@ -c $<
$(OBJS2): $(SRC2)
    $(CC) $(CFLAGS) -o $@ -c $<
clean:
    rm $(OBJS1) 
    rm $(OBJS2) 
    rm $(APP1)
    rm $(APP2)

如何为上述$SRC1$SRC2$OBJS1$OBJS2编写目标/先决条件规则?

COMMON = 
    src1.c 
    src2.c 
    ... 
    srcn.c
MAIN1 = main1.c
MAIN2 = main2.c
COMOBJ = ${COMMON:.c=.o}
OBJS1 = ${MAIN1:.c=.o} ${COMOBJ}
OBJS2 = ${MAIN2:.c=.o} ${COMOBJ}

我经常编写宏,例如 MAIN1.c = main1.c,因为 POSIX 需要make来支持该表示法(我遇到的所有变体支持它)。 但要注意,vim并不认为这样的宏名称是犹太洁食的(这是vim识别make宏的一个错误)。 然后我会写:

COMMON.c = ...
MAIN1.c  = main1.c
...
FILES1.o = ${MAIN1.c:.c=.o} ${COMMON.c:.c=.o}

等。 不是每个人都喜欢这种符号。

你应该只用一个对象列表就可以了

OBJS = src1.o src2.o #... etc
main1: main1.o $(OBJS)
main2: main2.o $(OBJS)

并让利用您提供的CCCFLAGSLDFLAGS来找出其余部分

最新更新