【问题标题】:GNU Make Including source files from target-specific variablesGNU Make 包括来自目标特定变量的源文件
【发布时间】:2012-02-29 16:50:12
【问题描述】:
我尝试通过make prog1 或make 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 $@
提前感谢您的帮助
【问题讨论】:
标签:
makefile
gnu
gnu-make
【解决方案1】:
无需使用特定于目标的变量。常规依赖就足够了:
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 $@
【解决方案2】:
除非您有某种未说明的特定要求,否则我建议让 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
这是很多输出,所以我建议将它传送到您选择的寻呼机。