这是我的情况,我正在尝试为我的c程序编写一个Makefile,它有这些组件 -
2标题:
src/header1.h
src/header2.h
N
来源:
src/src1.c
src/src2.c
src/src3.c
... src/srcn.c
2 Mains:
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
的目标/先决条件规则?
答案 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
并不认为像这样的宏名称是犹太人(这是vim
对make
宏的识别中的错误)。然后我写信:
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)
让我们使用您提供的CC
,CFLAGS
和LDFLAGS
来了解其余内容