2
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)

现在我有我的头在包含,我的主要在代码文件夹中。我想要它,这样当我运行 make 时,它​​会在将程序编译到 bin/assignment1 后运行程序,我该怎么做?

4

3 回答 3

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”。我还在cleanandrun目标上添加了“运行”目标和“.PHONY”,因为它们实际上并没有“制造”任何东西。

于 2013-02-13T23:02:38.817 回答
1

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

all: $(EXECUTABLE) run

run:
     bin/assignment1/main
于 2013-02-13T23:03:21.957 回答
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 中makemake如果您不这样做,您的 makefile 将在未修改的make all.

于 2013-02-13T23:03:14.373 回答