Mój katalog projektu wygląda następująco:
/project
Makefile
main
/src
main.cpp
foo.cpp
foo.h
bar.cpp
bar.h
/obj
main.o
foo.o
bar.o
Chciałbym, aby mój .cpp
plik makefile skompilował wszystkie pliki w /src
folderze do .o
plików w /obj
folderze, a następnie połączył wszystkie .o
pliki w /obj
wyjściowym pliku binarnym w folderze najwyższego poziomu /project
.
Nie mam prawie żadnego doświadczenia z Makefiles i nie jestem pewien, czego szukać, aby to osiągnąć.
Poza tym, czy jest to „dobry” sposób na zrobienie tego, czy też istnieje bardziej standardowe podejście do tego, co próbuję zrobić?
c++
build-process
makefile
Austin Hyde
źródło
źródło
Odpowiedzi:
Makefile część pytania
Jest to dość łatwe, chyba że nie musisz generalizować, spróbuj czegoś takiego jak poniższy kod (ale zamień wcięcie spacji na tabulatory w pobliżu g ++)
Automatyczne generowanie wykresów zależności
Funkcja „obowiązkowa” dla większości systemów marki. Za pomocą GCC można to zrobić w jednym przebiegu jako efekt uboczny kompilacji, dodając
-MMD
flagę doCXXFLAGS
i-include $(OBJ_FILES:.o=.d)
na końcu treści makefile:I jak już wspomnieliśmy, zawsze miej pod ręką Podręcznik tworzenia GNU , jest on bardzo pomocny.
źródło
OBJ_FILES = $(patsubst src/%.cpp,obj/%.o,$(CPP_FILES))
.$<
powinno być$^
dla reguły main.exe i myślę, że jest literówka zobj/%.o: src/%cpp
.make: *** No rule to make target '/main.o', needed by 'bin/main'. Pare.
Znaki wieloznaczne również działają u mnie, ale chciałbym wspomnieć o tych, którzy używają zmiennych katalogowych. Zawsze używaj ukośnika dla drzewa folderów (nie odwrotnego ukośnika), w przeciwnym razie nie powiedzie się:
źródło