Ric*_*ral 17 c signals makefile
问题可能不是描述我的问题的最佳问题,但我想不出更好的问题.我的makefile是这样的:
PROGRAM_NAME = prog
OBJECT_FILES = $(PROGRAM_NAME).o
CFLAGS = -O2 -Wall -g
$(PROGRAM_NAME) : $(OBJECT_FILES)
    gcc $(CFLAGS) -o $@ $(OBJECT_FILES)
$(PROGRAM_NAME).o : $(PROGRAM_NAME).c data.h
    gcc $(CFLAGS) -c $<
clean :
    $(RM) $(PROGRAM_NAME)
    $(RM) $(OBJECT_FILES)
    $(RM) *~ *.bak
run :
    @$(MAKE) && ./$(PROGRAM_NAME) $(ARGS)
当我想编译并运行时,我只是做"运行".这个问题是我的程序处理Ctrl + Z产生的信号,如果我用"make run"启动我的程序,信号将被发送到"make run"而不是我的程序本身.
基本上,调用"make run"与直接调用"make && ./prog"不同,因为在第一种情况下,"make run"不会终止,除非"prog"首先终止.
有没有解决的办法?
Jon*_*ler 17
您可以通过依赖于程序是否是最新的来简化"运行"目标,然后只需运行程序:
run:    ${PROGRAM_NAME}
        ./${PROGRAM} ${ARGS}
make当你已经跑步时,跑步没有太大意义make- 至少,不是在这种情况下.也许对于递归操作(在不同的目录中),但请参阅' Recursive Make Considered Harmful '.
此外,你的makefile通常应该提供一个目标' all',它通常应该是第一个默认目标.
dmc*_*kee 15
从makefile运行有点不寻常.您是否可能尝试复制某些IDE提供的"编译和运行"菜单项?Make没有那么好的装备.
目标命令中发生的所有事情都发生在没有直接连接到终端的子进程中,这就是make接收键击的原因.
另一件需要注意的事情:通常,对象文件到可执行阶段(链接)使用一组不同的标志(LDFLAGS和LIBS)然后是编译阶段.在这个简单的例子中,你可以逃脱它,但如果你复制这个makefile以便在更复杂的情况下使用,你将遇到麻烦.
如果您要一遍又一遍地构建和运行,您可以使用以下命令history来帮助解决此问题:
# Run this once
make && ./foo
# Repeat last command
!!