20

这个问题可能不是描述我的问题的最佳问题,但我想不出更好的问题。我的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)

当我想编译和运行时,我只需要“make run”。问题是我的程序处理由 Ctrl+Z 产生的信号,如果我用“make run”启动程序,信号将被发送到“make run”而不是我的程序本身。

基本上,调用“make run”与直接调用“make && ./prog”不同,因为在第一种情况下,“make run”不会终止,除非“prog”首先终止。

有没有解决的办法?

4

5 回答 5

19

你可以简化你的“运行”目标,让它取决于你的程序是否是最新的,然后简单地运行程序:

run:    ${PROGRAM_NAME}
        ./${PROGRAM} ${ARGS}

make当你已经在跑步时,跑步没有多大意义make——至少在这种情况下不是这样。也许对于递归操作(在不同的目录中),但请参阅' Recursive Make Considered Harmful '。

此外,您的 makefile 通常应该提供一个目标 ' all',它通常应该是第一个目标,因此是默认目标。

于 2009-05-24T16:37:03.657 回答
17

从 makefile 运行有点不寻常。您是否正在尝试复制某些 IDE 提供的“编译并运行”菜单项?Make 不具备这样做的能力。

目标命令中发生的所有事情都发生在不直接连接到终端的子进程中,这就是 make 接收您的击键的原因。

另一件要注意的事情:通常目标文件到可执行阶段(链接)使用一组不同的标志(LDFLAGSLIBS)然后是编译阶段。在这个简单的示例中,您可以侥幸成功,但是如果您复制此 makefile 以用于更复杂的情况,您将遇到麻烦。

于 2009-05-24T15:36:05.413 回答
4

If you're going to build and run over and over, You can use the history command to help with this:

# Run this once
make && ./foo

# Repeat last command
!!
于 2013-03-08T04:14:10.087 回答
3

正如 dmckee 的回答所说, make(1) 正在制作一些东西,而不是用于编译和运行。

当然,没有什么能阻止你创建一个shell别名make-run来执行预期的 ' make && ./prog args '。

于 2009-05-24T16:04:47.530 回答
2

你可以这样尝试:

APP      = olupxtest

SRCS     = $(wildcard *.cpp)
OBJS     = $(SRCS:.cpp=.o)

CXXFLAGS = -g -fPIC -c
LDFLAGS  =
LIBS     =

.PHONY: all clean

all: clean $(APP) run

$(APP): $(OBJS)
        $(CXX) $(LDFLAGS) $^ $(LIBS) -o $@

clean:
        $(RM) $(OBJS) $(APP)

run:    ${APP}
        ./${APP} ${ARGS}

在这里,您为目标调用了多个规则:all: clean $(APP) run

于 2019-08-06T08:02:25.887 回答