如何使用一个makefile构建可执行文件的变体?

jai*_*iro 3 c c++ makefile


我有一组源文件,我需要从中生成多个可执行文件的变体.比如我需要生成app1.elf,app2.elf,app3.elf从相同的main.ccomm.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)

我们假设我有以下文件:

  • SRC/main.c中
  • SRC/comm.c

当我像这样运行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)

Edw*_*nge 6

您将需要针对不同版本的多个目标.每个目标都需要自己的main.o和comm.o目标,这意味着你需要将它们称为其他东西,否则它们最终会相互混淆.然后你的所有人应该发挥作用,建立所有三个

  • 除此之外,您还可能希望使用子目录 - 如果您希望应用程序的名称完全相同,则必须有一些(其他)方法来区分它们. (2认同)