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后如何执行该程序?
答案 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”。我还在clean
和run
目标上添加了“运行”目标和“.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
时才运行它。