2012-12-25 12 views
17

Próbuję napisać plik Makefile z moimi plikami źródłowymi i obiektowymi oddzielonymi i nie mogę znaleźć właściwego sposobu, aby to osiągnąć. Mam dwie metody, które działają, ale mam nadzieję, że ktoś może wskazać "prawidłowy" sposób, aby to zrobić.Właściwa metoda dla obiektów wieloznacznych w GNU Make

Mój projekt jest podzielony na foldery src i obj z plikiem Makefile na tym samym poziomie, co te.

Pierwsza metoda używa funkcji wieloznacznej do znalezienia plików źródłowych w pliku src, a następnie używa zastępowania tekstu do określenia odpowiednich plików obiektów.

SRC = $(wildcard src/*.cpp) 
OBJ = $(SRC:.cpp=.o) 

prog: $(OBJ) 
     $(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) -o prog $(patsubst src/,obj/,$(OBJ)) 

%.o: %.cpp 
    $(CC) $(CFLAGS) -c $< -o $(COMPILE)/$(@F) 

To wydaje się działać, jednak za każdym razem biegnę make prog to recompiles wszystkich plików obiektowych. Zmienna OBJ musi mieć przed wszystkimi obiektami obiekt src/, inaczej otrzymam "brak reguły do ​​wykonania celu". Na plus, mogę łatwo użyć patsubst w celu prog, aby określić pliki obiektów.

Druga metoda jest podobna, ale wykorzystuje vpaths i tekst zastępczy na OBJ zmiennej:

vpath = %.cpp src 
vpath = %.o obj 

SRC = $(wildcard src/*.cpp) 
OBJ = $(subst src/,,$(SRC:.cpp=.o)) 
POBJ = $(patsubst src/,obj/$(SRC:.cpp=.o)) 

prog: $(OBJ) 
     $(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) -o prog $(POBJ) 

%.o: %.cpp 
    $(CC) $(CFLAGS) -c $< -o $(COMPILE)/$(@F) 

Eliminuje to rekompilacji plików obiektowych, ale wymaga ode mnie, aby dodać kolejną zmienną POJB za cel prog (od I nie może zrobić żadnego patsubst na plikach obiektów bez bazodruku).

Obie metody działają, a każda ma swoje zalety w stosunku do drugiej, ale która z nich jest "poprawnym" podejściem, a jeśli nie, jaki jest właściwy sposób na osiągnięcie tego typu budynku?

Odpowiedz

19

Pierwszym przykładem jest prawie tam:

SRC = $(wildcard src/*.cpp) 
OBJ = $(patsubst src/%.cpp, obj/%.o, $(SRC)) 

prog: $(OBJ) 
    $(CC) $(CFLAGS) $(LDFLAGS) $(LIBS) $(OBJ) -o prog 

obj/%.o: src/%.cpp 
    $(CC) $(CFLAGS) -c $< -o [email protected] 
+1

'src = $ (. Wieloznaczny src/**/* cpp)' do kodu źródłowego siedzi w podkatalogu 'src' – checksum

Powiązane problemy