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

时间:2015-06-17 01:03:18

标签: 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 Mains:

    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的目标/先决条件规则?

2 个答案:

答案 0 :(得分:1)

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并不认为像这样的宏名称是犹太人(这是vimmake宏的识别中的错误)。然后我写信:

COMMON.c = ...
MAIN1.c  = main1.c
...

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

等。不是每个人都喜欢这种表示法。

答案 1 :(得分:1)

你应该没有对象列表

OBJS = src1.o src2.o #... etc

main1: main1.o $(OBJS)

main2: main2.o $(OBJS)

让我们使用您提供的CCCFLAGSLDFLAGS来了解其余内容