2016-10-17 5 views
1

Ich habe die folgenden Dateien in meinen proj2-Verzeichnissen und muss sie zusammen kompilieren, um eine ausführbare Datei zu haben.Wie Makefile zu kompilieren, mehrere CPP-Dateien in verschiedenen Verzeichnissen mit einem einzigen Makefile zu kompilieren?

proj2/main.cpp 
    proj2/model/Player.cpp 
    proj2/model/gameBoard.cpp 
    proj2/controller/TTTController.cpp 
    proj2/Makefile 

Ich verwende den folgenden Befehl in meinem Makefile, aber es funktioniert nicht.

all: 
    g++ /project2_p1/main.cpp /project2_p1/controller/TTTController.cpp   /model/gameBoard.cpp /model/Player.cpp -o ttt 
clean: 
    -rm ttt 

Kann jemand mir helfen please.Thank Sie

+5

Sie müssen ein grundlegendes Unix-Kommandozeilen-Terminal-Tutorial lesen. Was meinst du ein führendes '/' in einem Pfad? –

+2

Sie können mit Make nichts bauen, bis Sie wissen, wie Sie es bauen * ohne * Make. – Beta

Antwort

0

Ich empfehle Ihnen dringend, dem Lernen beginnen make, da es eines der grundlegenden Werkzeuge, die Programmierer verwenden. Und wenn Sie C++ lernen können, können Sie definitiv make lernen.

In Ihrem Projekt haben Sie Quelldateien in ihren eigenen Unterverzeichnissen vergraben, so dass Sie alle mit dem Befehl $(shell find...) verwenden können. Gleiches gilt für alle Header-Dateien in Ihrem Projekt.

Indem all: die direkte Ziel es bedingungslos ausgeführt wird, und Sie verlieren die Vorteile der make mit - nur kompilieren, wenn Sie etwas ändern.

Nachdem gesagt, dass die grundlegende Vorlage, die ich hier zur Verfügung stelle, könnte verbessert werden, nur die Quelldateien neu zu kompilieren, die geändert haben, aber das ist eine Übung für den Leser.

Ich denke, dies in Ihrem Fall funktionieren soll:

# set non-optional compiler flags here 
CXXFLAGS += -std=c++11 -Wall -Wextra -pedantic-errors 

# set non-optional preprocessor flags here 
# eg. project specific include directories 
CPPFLAGS += 

# find cpp files in subdirectories 
SOURCES := $(shell find . -name '*.cpp') 

# find headers 
HEADERS := $(shell find . -name '*.h') 

OUTPUT := ttt 

# Everything depends on the output 
all: $(OUTPUT) 

# The output depends on sources and headers 
$(OUTPUT): $(SOURCES) $(HEADERS) 
    $(CXX) $(CXXFLAGS) $(CPPFLAGS) -o $(OUTPUT) $(SOURCES) 

clean: 
    $(RM) $(OUTPUT) 
0

das ist mein minGW Projekt Makefile-Codes:

hepsi: derle calistir 
Nesneler := ./lib/Hata.o ./lib/Hatalar.o ./lib/Dugum.o ./lib/ListeGezici.o ./lib/BagilListe.o 

    derle: 
     g++ -I ./include/ -o ./lib/Hata.o -c ./src/Hata.cpp 
     g++ -I ./include/ -o ./lib/Hatalar.o -c ./src/Hatalar.cpp 
     g++ -I ./include/ -o ./lib/Dugum.o -c ./src/Dugum.cpp 
     g++ -I ./include/ -o ./lib/ListeGezici.o -c ./src/ListeGezici.cpp 
     g++ -I ./include/ -o ./lib/BagilListe.o -c ./src/BagilListe.cpp 
     g++ -I ./include/ -o ./bin/test $(Nesneler) ./src/test.cpp 

    calistir: 
     ./bin/test 

in Ihrem Projekt ich denke, das funktioniert;

all: compile run 
Objects := ./lib/Player.o ./lib/gameBoard.o ./lib/TTTController.o 

compile: 
    g++ -I ./include/ -o ./lib/Player.o -c ./model/Player.cpp 
    g++ -I ./include/ -o ./lib/gameBoard.o -c ./model/gameBoard.cpp 
    g++ -I ./include/ -o ./lib/TTTController.o -c .controller/TTTController.cpp 
    g++ -I ./include/ -o ./bin/main $(Objects) ./main.cpp 

run: 
    ./bin/main 

lib Ordner enthält .o-Dateien. Du kannst es riskieren, wenn du willst. include Ordner bezieht sich auf Ihre Kopfzeile .h oder .hpp Dateien. Sie können jede von ihnen entsprechend Ihrer Kopfzeilenposition ändern.

bin Ordner enthält Ihre .exe Datei mit der Bezeichnung main.exe. Sie können es ändern oder entfernen

run: 
    ./main 

Ich hoffe, es wird funktionieren.

@Galik hat Recht. Wenn Sie C++ lernen möchten, sollten Sie unbedingt make lernen.

Verwandte Themen