GNU Make包含来自特定于目标的变量的源文件

时间:2012-02-29 16:50:13

标签: makefile gnu gnu-make

我尝试用make prog1make prog2构建两个带有一个GNU Makefile的程序。我尝试使用特定于目标的变量来指定目标独有的源文件,但是已经构建了test1.c和test2.c.它们仅在链接可执行文件时引用。如何让Makefile编译test1.c或test2.c?

以下是我的Makefile的摘录:

...
prog1: PASRC = test1.c
prog2: PASRC = test2.c
...
ASRC = $(PASRC) common.c
...
OBJS = $(ASRC:.c=.o)
...
prog1: $(OBJS) prog1.elf
prog2: $(OBJS) prog2.elf
...
%elf: $(OBJS)
    $(CC) $(OBJS) $(LDFLAGS) $(LIBS) -o $@

提前感谢您的帮助

2 个答案:

答案 0 :(得分:2)

无需使用目标特定变量。常规依赖应该足够了:

all : prog1 prog2 # default target

prog1 : test1.o 
prog2 : test2.o 
prog1 prog2 : common.o

%.o : %.c # how to build any .o from a corresponding .c
    $(CC) -c -o $@ $(CPPFLAGS) $(CFLAGS) $< 

prog1 prog2 : % : 
    $(CC) $^ $(LDFLAGS) $(LDLIBS) -o $@

答案 1 :(得分:0)

除非你有某些你没有说明的具体要求,否则我建议让make为你做的工作(默认规则和标志)。

PROGS = prog1 prog2
COMMON_OBJS = common.o

all: $(PROGS)
prog1 prog2: % : %.o $(COMMON_OBJS)

clean:
        rm -f $(PROGS) $(PROGS:%=%.o) $(COMMON_OBJS)

你仍然可以设置CLFAGS,LDFLAGS等(在命令行或makefile中),默认规则会选择它们。

如果您使用的是GNU make,则可以通过运行以下命令查看所有生成和自动规则:

make -n -p

这是很多输出,所以我建议将它用于你选择的寻呼机。