如何在构建后使makefile执行

时间:2013-02-13 22:55:35

标签: c++ makefile

CPP=g++
CPPFLAGS=-Iincludes
SOURCEDIR=code
SOURCES=$(shell ls $(SOURCEDIR))
OBJECTDIR=obj
BINDIR=bin
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=bin/assignment1

%.o: $(SOURCEDIR)/%.cpp
    if [ ! -d $(OBJECTDIR) ]; then mkdir $(OBJECTDIR); fi; $(CPP) $(CPPFLAGS) -c $< -o $(OBJECTDIR)/$@

$(EXECUTABLE): $(OBJECTS)
    if [ ! -d $(BINDIR) ]; then mkdir $(BINDIR); fi; $(CPP) $(addprefix $(OBJECTDIR)/,$(OBJECTS)) -o $@

clean:
    if [ -d $(BINDIR) ]; then rm -rfv $(BINDIR); fi; if [ -d $(OBJECTDIR) ]; then rm -rfv $(OBJECTDIR); fi;

all: $(EXECUTABLE)

现在我的标题包含在我的主要代码文件夹中。我想要它,这样当我运行时,它会将程序编译成bin / assignment1后如何执行该程序?

3 个答案:

答案 0 :(得分:3)

如果在makefile中添加几行,则可以使其运行代码:

CPP=g++
CPPFLAGS=-Iincludes
SOURCEDIR=code
SOURCES=$(shell ls $(SOURCEDIR))
OBJECTDIR=obj
BINDIR=bin
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=bin/assignment1

all: $(EXECUTABLE) run

%.o: $(SOURCEDIR)/%.cpp
    if [ ! -d $(OBJECTDIR) ]; then mkdir $(OBJECTDIR); fi; $(CPP) $(CPPFLAGS) -c $< -o $(OBJECTDIR)/$@

$(EXECUTABLE): $(OBJECTS)
    if [ ! -d $(BINDIR) ]; then mkdir $(BINDIR); fi; $(CPP) $(addprefix $(OBJECTDIR)/,$(OBJECTS)) -o $@

.PHONY : clean
clean:
    if [ -d $(BINDIR) ]; then rm -rfv $(BINDIR); fi; if [ -d $(OBJECTDIR) ]; then rm -rfv $(OBJECTDIR); fi;

.PHONY : run
run: $(EXECUTABLE)
    $(EXECUTABLE) arg1 arg2

我将你的“所有”目标移到了顶部 - 这样,如果你输入“make”,它默认会“make all”。我还在cleanrun目标上添加了“运行”目标和“.PHONY”,因为它们实际上并没有“制造”任何内容。

答案 1 :(得分:1)

您只需添加另一个目标并将其添加到所有依赖项列表中,这样您就可以拥有:

all: $(EXECUTABLE) run

run:
     bin/assignment1/main

答案 2 :(得分:0)

可能就像用

替换当前all目标一样简单
all: execute

execute: $(EXECUTABLE)
    $(EXECUTABLE)   # This works because you have a well qualified path
                    # If $(EXECUTABLE) was a bare name you would need 
                    # to use ./$(EXECUTABLE)

.PHONY: execute clean

虽然你应该将all目标作为makefile中的第一个目标,如果你想在只需键入make时就可以构建它;如果你不这样做,你的makefile将在未经修改的make上构建可执行文件,但只有在你使用make all时才运行它。