如何正确地使我的makefile编译和运行?

时间:2009-05-24 15:12:56

标签: c makefile signals

问题可能不是描述我的问题的最佳问题,但我想不出更好的问题。我的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&amp;&amp; ./prog”不同,因为在第一种情况下,“make run”不会终止,除非“prog”首先终止。

有解决方法吗?

5 个答案:

答案 0 :(得分:16)

您可以通过依赖于您的程序是否是最新的,然后只需运行程序来简化“运行”目标:

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

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

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

答案 1 :(得分:15)

从makefile运行有点不寻常。您是否可能尝试复制某些IDE提供的“编译和运行”菜单项? Make没有那么好的装备。

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

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

答案 2 :(得分:4)

如果您要构建并反复运行,可以使用history命令来帮助解决此问题:

# Run this once
make && ./foo

# Repeat last command
!!

答案 3 :(得分:3)

正如dmckee的回答所说,make(1)正在创造一些东西,而不是为了编译和运行。

当然,没有什么可以阻止你创建一个 shell 别名 make-run ,它可以完成预期的' make&amp;&amp; ./prog args '。

答案 4 :(得分: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