Skoro masz wszystko w różnych katalogach, to w Makefile'u musisz podać te ścieżki do plików. Można poprawić twój przykład na pałę:
Kod: Zaznacz cały
dzialania.out: obj/main.o obj/modul.o
g++ -o dzialania.out obj/main.o obj/modul.o
obj/modul.o: src/modul.cpp
g++ -c -o obj/modul.o src/modul.cpp
obj/main.o: src/main.cpp
g++ -c -o obj/main.o src/main.cpp
Można go trochę "ucywilizować":
Kod: Zaznacz cały
dzialania.out: obj/main.o obj/modul.o
g++ -o $@ $^
obj/modul.o: src/modul.cpp
g++ -c -o $@ $<
obj/main.o: src/main.cpp
g++ -c -o $@ $<
(nie sprawdzałem czy te dwa powyższe zadziałają). Można też zrobić tak:
Kod: Zaznacz cały
FILES = main.cpp modul.cpp
OBJS := $(patsubst %.cpp,%.o,$(FILES))
OBJS := $(addprefix obj/,$(OBJS))
CPPFLAGS += -Iinc/
dzialania.out: $(OBJS)
$(CXX) -o $@ $^
obj/%.o: src/%.cpp
$(CC) -c $(CPPFLAGS) -o $@ $<
(ten działa, sprawdzałem). Dzięki temu dodanie nowego pliku źródłowego to będzie modyfikacja jednej linijki (FILES = ...). Wadą powyższych rozwiązań jest to, że pliki źródłowe (cpp) nie mają wyszczególnionych zależności od plików nagłówkowych (h). make nie zauważy jeśli zmodyfikujemy tylko plik nagłówkowy i nic więcej. Nie przekompiluje projektu. Takie coś:
Kod: Zaznacz cały
# $(call make-depend, source-file, object-file, depend-file)
define make-depend
$(CC) -MM -MF $(3) -MP -MT $(2) $(CPPFLAGS) $(1)
endef
FILES = main.cpp modul.cpp
OBJS := $(patsubst %.cpp,%.o,$(FILES))
OBJS := $(addprefix obj/,$(OBJS))
CPPFLAGS += -Iinc/
dzialania.out: $(OBJS)
$(info $@ $^)
$(CXX) -o $@ $^
obj/%.o: src/%.cpp
$(call make-depend, $<, $@, $(subst .o,.d,$@))
$(CC) -c $(CPPFLAGS) -o $@ $<
-include $(subst .o,.d,$(OBJS))
rozwiązuje ten problem. Funkcja make-depend generuje pliki *.d w katalogu obj/, które zawierają zależności dla plików źródłowych. Na końcu Makefile'a dołączamy te pliki (include), dzięki czemu make ma pełne informacje o zależnościach.