122 votes

Makefiles - Compiler tous les fichiers .cpp dans src / .o ' s dans obj /, puis lien vers binaire dans /

Donc, mon répertoire de projet ressemble à ceci:

/project
    Makefile
    main
    /src
        main.cpp
        foo.cpp
        foo.h
        bar.cpp
        bar.h
    /obj
        main.o
        foo.o
        bar.o

Ce que je voudrais que mon makefile à faire serait de compiler tous .cpp fichiers dans l' /src le dossier d' .o fichiers dans l' /obj le dossier, puis le lien entre tous les .o fichiers en /obj sur la sortie binaire dans le dossier racine /project.

Le problème est que je n'ai presque pas d'expérience avec les Makefiles, et je ne suis pas vraiment sûr de ce de recherche pour accomplir cela.

Aussi, est-ce une "bonne" façon de le faire, ou est-il un plus à l'approche standard pour ce que je suis en train de faire?

193voto

bobah Points 7375

Makefile partie de la question

C'est assez facile, sauf si vous n'avez pas besoin de généraliser essayez quelque chose comme le code ci-dessous (mais remplacer l'espace de l'indentation avec des onglets près de g++)

CPP_FILES := $(wildcard src/*.cpp)
OBJ_FILES := $(addprefix obj/,$(notdir $(CPP_FILES:.cpp=.o)))
LD_FLAGS := ...
CC_FLAGS := ...

main.exe: $(OBJ_FILES)
   g++ $(LD_FLAGS) -o $@ $^

obj/%.o: src/%.cpp
   g++ $(CC_FLAGS) -c -o $@ $<

Automatique graphe de dépendance de la génération

Un "must" pour la plupart des systèmes. Avec GCC peut être fait en un seul passage, comme un effet secondaire de la compilation par l'ajout d' -MMD le drapeau en CC_FLAGS et -include $(OBJFILES:.o=.d) à la fin de l'makefile corps:

CC_FLAGS += -MMD
-include $(OBJFILES:.o=.d)

Et comme les gars déjà mentionné, ont toujours GNU Make Manuel , il est très utile.

6voto

xesf Points 11

Caractère générique fonctionne pour moi aussi, mais je voudrais donner une note de côté pour ceux qui utilisent des variables de répertoire. Utilisez toujours la barre oblique pour l’arborescence des dossiers (pas de barre oblique inverse), sinon elle échouera :

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X