我有一组源文件,我需要从中生成多个可执行文件的变体.比如我需要生成app1.elf,app2.elf,app3.elf从相同的main.c和comm.c.每个应用程序之间的区别是节点地址,这是在gcc调用中传递的参数.即:
gcc -DNODE=1 -oapp1.elf main.c
gcc -DNODE=2 -oapp2.elf main.c
gcc -DNODE=3 -oapp3.elf main.c
Run Code Online (Sandbox Code Playgroud)
我们假设我有以下文件:
当我像这样运行Makefile时:
make all_nodes
make only使用以下输出构建app1.elf:
内置app1
内置app2
内置app3
失败! 输出似乎表明它有效,但它只生成一个可执行文件,即app1.elf.有人想指出我做错了什么吗?
为了进一步解释我的Makefile,我创建了一个cleanobjs目标来清除./obj子目录中的对象.这是我尝试使用新节点地址'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
Run Code Online (Sandbox Code Playgroud)
您将需要针对不同版本的多个目标.每个目标都需要自己的main.o和comm.o目标,这意味着你需要将它们称为其他东西,否则它们最终会相互混淆.然后你的所有人应该发挥作用,建立所有三个