这是我的情况,我正在尝试为我的c程序编写一个Makefile,它具有以下组件 -
-
2 个标题:
-
src/header1.h
-
src/header2.h
-
-
N
资料来源:-
src/src1.c
-
src/src2.c
-
src/src3.c
...... -
src/srcn.c
-
-
2 主电源:
-
src/main1.c
-
src/main2.c
-
main1.c
和 main2.c
采用所有相同的src*.c
和header*.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)
并让利用您提供的CC
、CFLAGS
和LDFLAGS
来找出其余部分