J’ai cherché à trouver un makefile c ++ “minimal” simple recommandé pour Linux qui utilisera g ++ pour comstackr et lier un fichier unique et un fichier h. Idéalement, le fichier de création ne contiendra même pas les noms de fichier physique et ne contiendra qu’un fichier .cpp à transformer .o. Quel est le meilleur moyen de générer un tel fichier makefile sans plonger dans les horreurs de autoconf?
Le répertoire en cours contient, par exemple
t.cpp e
et je veux un makefile pour que cela soit créé. J’ai essayé autoconf mais en supposant que .h est gcc au lieu de g ++. Oui, bien que n’étant pas un débutant, je réapprends les meilleures approches de manipulation de projet d’il y a des années et, par conséquent, je recherche des moyens automatisés de créer et de gérer des makefiles pour de petits projets.
S’il s’agit d’un fichier unique, vous pouvez taper
make t
Et il invoquera
g++ t.cpp -ot
Cela n’a même pas besoin d’un Makefile dans le répertoire, bien que cela devienne confus si vous avez un t.cpp, un tc et un t.java, etc.
Aussi un vrai Makefile:
SOURCES := t.cpp # Objs are all the sources, with .cpp replaced by .o OBJS := $(SOURCES:.cpp=.o) all: t # Comstack the binary 't' by calling the comstackr with cflags, lflags, and any libs (if defined) and the list of objects. t: $(OBJS) $(CC) $(CFLAGS) -ot $(OBJS) $(LFLAGS) $(LIBS) # Get a .o from a .cpp by calling comstackr with cflags and includes (if defined) .cpp.o: $(CC) $(CFLAGS) $(INCLUDES) -c $<
Voici un fichier makefile générique de mon répertoire d’extraits de code:
SOURCES=$(wildcard *.cpp) OBJECTS=$(SOURCES:.cpp=.o) DEPS=$(SOURCES:.cpp=.d) BINS=$(SOURCES:.cpp=) CFLAGS+=-MMD CXXFLAGS+=-MMD all: $(BINS) .PHONY: clean clean: $(RM) $(OBJECTS) $(DEPS) $(BINS) -include $(DEPS)
Tant que vous avez une source .cpp produisant un binary, vous n’avez besoin de rien de plus. Je ne l’ai utilisé qu’avec GNU make, et la génération de dépendances utilise la syntaxe gcc (également prise en charge par icc). Si vous utilisez les compilateurs SUN, vous devez remplacer “-MMD” par “-xMMD”. Assurez-vous également que la tabulation au début de la ligne après le clean:
ne soit pas modifiée en espaces lorsque vous collez ce code ou que make
vous donnera une erreur de séparateur manquante.
Avez-vous regardé SCons ?
Créez simplement un fichier SConstruct avec les éléments suivants:
Program("t.cpp")
Puis tapez:
scons
Terminé!
En supposant qu’aucun paramètre de configuration préconfiguré à l’échelle du système:
CXX = g++ CPPFLAGS = # put pre-processor settings (-I, -D, etc) here CXXFLAGS = -Wall # put comstackr settings here LDFLAGS = # put linker settings here test: test.o $(CXX) -o $@ $(CXXFLAGS) $(LDFLAGS) test.o .cpp.o: $(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $< test.cpp: test.h
Avez-vous regardé OMake ?
OMakeroot
open build/C DefineCommandVars() .SUBDIRS: .
OMakefile
.DEFAULT: $(CXXProgram test, test)
Ensuite, sous Linux ou Windows, tapez simplement:
omake
En bonus, vous obtenez automatiquement:
Un fichier GNU Makefile relativement petit, utilisant des règles prédéfinies et des repositorys automatiques:
CC=c++ CXXFLAGS=-g -Wall -Wextra -MMD LDLIBS=-lm program: program.o sub.o clean: $(RM) *.o *.d program -include $(wildcard *.d)
Quelques bonnes références sur la création d’un Makefile de base
http://en.wikipedia.org/wiki/Make_(software)
http://mrbook.org/tutorials/make/
http://www.opussoftware.com/tutorial/TutMakefile.htm
http://www.hsrl.rutgers.edu/ug/make_help.html
Le premier couple en particulier a un exemple minimal de Makefiles comme vous le décriviez. J’espère que cela pourra aider.
Construire avec l’option de débogage:
env = Environment() if ARGUMENTS.get('debug', 0): env.Append(CCFLAGS = ' -g') env.Program( source = "template.cpp" )
Florin a un bon sharepoint départ. Je n’aimais pas gnu autoconf, alors j’ai commencé là-bas et ai poussé le concept plus loin en l’appelant MagicMakefile. J’en ai 3 versions du plus simple au plus complexe. La dernière en date est maintenant sur github: https://github.com/jdkoftinoff/magicmake
Fondamentalement, il suppose que vous avez une disposition standard pour les fichiers source de votre projet et utilise la fonction générique pour créer les règles de makefile à la volée. Ces règles sont ensuite évaluées. emballage.
[edit] À ce stade, j’utilise cmake pour tous mes projets car il génère des fichiers de projet utiles pour de nombreux systèmes de construction.
Jeff Koftinoff
Je cherchais ce à quoi pourrait ressembler un Makefile minimal autre que
some_stuff: @echo "Hello World"
Je sais que je suis en retard pour cette soirée, mais je pensais aussi lancer mon chapeau sur le ring. Ce qui suit est mon Makefile de projet de répertoire unique que j’ai utilisé pendant des années. Avec une petite modification, il utilise plusieurs répertoires (par exemple, src, obj, bin, en-tête, test, etc.). Suppose que tous les en-têtes et les fichiers source se trouvent dans le répertoire en cours. Et, doit donner au projet un nom qui est utilisé pour le nom binary en sortie.
NAME = my_project FILES = $(shell basename -a $$(ls *.cpp) | sed 's/\.cpp//g') SRC = $(patsubst %, %.cpp, $(FILES)) OBJ = $(patsubst %, %.o, $(FILES)) HDR = $(patsubst %, -include %.h, $(FILES)) CXX = g++ -Wall %.o : %.cpp $(CXX) $(HDR) -c -o $@ $< build: $(OBJ) $(CXX) -o $(NAME) $(OBJ) clean: rm -vf $(NAME) $(OBJ)
Si vos problèmes sont liés au fait que autoconf pense que le fichier .h est un fichier ac, essayez de le renommer en .hpp ou .h ++.