【发布时间】:2011-01-10 21:01:31
【问题描述】:
我有一组源文件,我需要从中生成可执行文件的多个变体。例如,我需要从同一个 main.c 生成 app1.elf、app2.elf、app3.elf > 和 comm.c。每个应用程序之间的区别在于一个节点地址,一个在 gcc 调用中向下传递的参数。即:
gcc -DNODE=1 -oapp1.elf main.c
gcc -DNODE=2 -oapp2.elf main.c
gcc -DNODE=3 -oapp3.elf main.c
假设我有以下文件:
- src/main.c
- src/comm.c
当我这样运行 Makefile 时:
制作所有节点
make 只构建 app1.elf,输出如下:
内置应用程序1
构建应用程序2
内置app3
失败! 输出似乎表明它有效,但它只生成一个可执行文件,即 app1.elf。有人愿意指出我做错了什么吗?
为了进一步解释我的 Makefile,我创建了一个 cleanobjs 目标来清除 ./obj 子目录中的对象。这是我尝试使用新的 node 地址“make”重建 obj 文件,但它失败了。我是否以不打算使用的方式使用“make”?我知道我也可以创建一个批处理文件来运行 make (我已经成功地完成了),但我想知道我做错了什么。我的 Makefile 如下:
obj/%.o: src/%.c
gcc -DNODE=$(NODE) -o$@ $<
app.elf : ./obj/main.o ./obj/comm.o
gcc -oapp$(NODE).elf main.o comm.o
node1 : NODE=1
node1 : cleanobj app.elf
@echo 'Built app1'
node2 : NODE=2
node2 : cleanobj app.elf
@echo 'Built app2'
node3 : NODE=3
node3 : cleanobj app.elf
@echo 'Built app3'
all_nodes : node1 node2 node3
cleanobj :
rm -rf obj/main.o obj/comm.o
.PHONY : cleanobj
【问题讨论】:
-
只是想补充一点,失败的原因是 make 每个实例只运行一次目标。所以 cleanobj 和 app.elf 都是为 node1 目标构建的,而对于 node2 和 node3 目标,它都被优化了。