2013-06-04 19 views
6

Sto cercando di utilizzare Makefile per compilare un gruppo di .cpp file che si trovano in src/code/*.cpp, quindi compilare ogni *.o in build/, e infine di generare eseguibili con quelle build/ pure.Makefile: Compilare dalla directory in un'altra directory

Ho letto un paio di risposte con cui ho provato a lavorare ma ho riscontrato problemi che non capisco.

CC = g++ 
FLAGS = -g -c 

SOURCEDIR = /src/code 
BUILDDIR = build 

EXECUTABLE = DesktopSpecificController 
SOURCES = $(wildcard src/code/*.cpp) 
OBJECTS = $(patsubst src/code/*.cpp,build/%.o,$(SOURCES)) 

all: dir $(BUILDDIR)/$(EXECUTABLE) 

dir: 
    mkdir -p $(BUILDDIR) 

$(BUILDDIR)/$(EXECUTABLE): $(OBJECTS) 
    $(CC) $^ -o [email protected] 

$(OBJECTS): $(BUILDDIR)/%.o : $(SOURCEDIR)/%.cpp 
    $(CC) $(FLAGS) $< -o [email protected] 

clean: 
    rm -f $(BUILDDIR)/*o $(BUILDDIR)/$(EXECUTABLE) 

faccio il seguente errore, e io non so perché:

Makefile:19: target `src/code/main.cpp' doesn't match the target pattern 

Vedo anche che quando si cerca di costruire il file eseguibile, non sta usando i file .o, quindi sembra che la mia regola sia sbagliata qui.

+0

appena aggiornato un po 'il mio Makefile. – user1777907

risposta

8

La tua funzione patsubst è errata; non è possibile utilizzare caratteri jolly shell come *. Si desidera:

OBJECTS = $(patsubst $(SOURCEDIR)/%.cpp,$(BUILDDIR)/%.o,$(SOURCES)) 

Inoltre si dovrebbe utilizzare SOURCEDIR e BUILDDIR ovunque, non solo in alcuni punti (in caso contrario si otterrà incongruenze). E, infine, il valore della SOURCEDIR è sbagliato: non dovrebbe iniziare con / mi aspetto:

SOURCEDIR = src/code 

SOURCES = $(wildcard $(SOURCEDIR)/*.cpp) 
+0

Grazie mille! Hai risolto il mio problema, ora funziona :) Grazie mille! – user1777907

+1

Prego. Non dimenticare che SO dovrebbe essere uno dei tuoi ultimi resort, _dopo aver provato a risolverlo da solo. Ecco alcuni suggerimenti per il debugging dei makefile: in primo luogo, l'opzione '-p' stamperà l'intero database make, inclusi tutti i valori di tutte le variabili. Inoltre, in GNU make puoi usare la funzione '$ (info ...)' per stampare informazioni come valori variabili. Stampare quei valori ti avrebbe dato un buon indizio su dove si trovava il problema. – MadScientist

+2

Per chiarire il suggerimento di MadScientist, '$ (info ...)' può essere usato come '$ (info $ (SOURCES))', per esempio. Può essere inserito immediatamente dopo la definizione della variabile di interesse. –

Problemi correlati