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」と入力すると、デフォルトで「すべて作成」が実行されます。また、「実行」ターゲットと、and ターゲットに「.PHONY」を追加しました。cleanこれらrunは実際には何も「作成」しないためです。

于 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単純に入力したときにターゲットをビルドする場合は、ターゲットをメイクファイルの最初のターゲットとして配置する必要がありますmake。そうしないと、メイクファイルは変更されていない で実行可能ファイルをビルドしますが、make使用する場合にのみ実行しますmake all

于 2013-02-13T23:03:14.373 に答える