2016-04-05 10 views
1

Ich schrieb ein Makefile, um alle Dateien in meinem Projekt zu kompilieren und zu verbinden. Im Moment habe ich nur 2 cpp Dateien: src/main.cpp und src/DBEngine/benchmark/ssb/ssb_main.cpp.generisches Makefile, das keine Regel zeigt, um Zielfehler zu machen

Mein Make-Datei Inhalt ist:

CPP_FILES := $(wildcard src/*.cpp) $(wildcard src/DBEngine/benchmark/ssb/*.cpp) 
OBJ_FILES := $(addprefix bin/obj/,$(notdir $(CPP_FILES:.cpp=.o))) 
DEBUG_OBJ_FILES := $(addprefix bin/debug/,$(notdir $(CPP_FILES:.cpp=.o))) 
CC_FLAGS := -I${PWD} 

main.out: $(OBJ_FILES) 
    g++ -o [email protected] $(OBJ_FILES) 

bin/obj/%.o: src/%.cpp 
g++ -c -o [email protected] $< (CC_FLAGS) -w 

Aber wenn ich ein Make tun gibt es den Fehler:

make: *** Keine Regel Ziel von main.outbin/debug/ssb_main.o, erforderlich zu machen. Halt.

Antwort

1

Kurzversion: Ihre Musterregel erweitert wird, wie für die Objektdateien in DBEngine

bin/obj/ssb_main.o: src/ssb_main.cpp 

folgt können Sie sehen, wie das werde ich bin sicher nicht funktionieren.

können Sie ein anderes Muster Regel hinzuzufügen

bin/obj/%.o: src/DBEngine/benchmark/ssb/%.cpp 
    g++ -c -o [email protected] $< $(CC_FLAGS) -w 

Eine einfachere Methode ist jedoch zu beheben, ist Ihre Quelle zu spiegeln und Bäume bauen und vpath verwenden, stellen Sie sicher, dass es ein Verzeichnis DBEngine/benchmark/ssb im Makefile-Verzeichnis als auch genannt ist und verwenden Sie Folgendes:

CPP_FILES := $(wildcard src/*.cpp) $(wildcard src/DBEngine/benchmark/ssb/*.cpp) 
OBJ_FILES := $(CPP_FILES:src/%.cpp=%.o) 
CPPFLAGS := -I${PWD} 
CXXFLAGS := -w 

vpath %.cpp src 

main: $(OBJ_FILES) 

Die integrierten Regeln werden den Rest erledigen.

Seitliche Hinweise: -I${PWD} ist überflüssig, und -w ist normalerweise eine schlechte Idee.

+0

Vielen Dank für Ihre ausführliche Antwort. –

1

In der Kompilierregel haben Sie angegeben, dass sich die Quelldateien im Verzeichnis 'src' befinden. Aber aus Ihrer Beschreibung scheint es, dass sich die Datei ssb_main.cpp im Ordner 'src/DBEngine/benchmark/ssb /' befindet, so dass make die Abhängigkeit zur Kompilierung von ssb_main.o nicht findet.

Sie können die Variable VPATH verwenden, um die Ordner anzugeben, in denen make nach Ihren Quelldateien suchen soll.

0

Da Sie Unterordner haben, ist Ihr src Ordner können Sie versuchen,

CPP_FILES := $(shell ls -pR ./src | grep -v /) 

zu bedienen Es werden alle CPP-Dateien unter src und seinen Unterordnern Liste ausgenommen. und .. .

+0

Hi, ls -A -R src/*. Cpp kann die Datei src/DBEngine/benchmark/ssb/ssb_main.cpp nicht finden –

+0

Ich habe den Befehl ls leicht modifiziert. Es sollte jetzt alle Dateien im Ordner src und den Unterordnern auflisten – NeoSer

Verwandte Themen