2010-06-22 13 views
3

Je cours sous Windows 7 avec gcc/g ++ sous Cygwin. Quel serait le format Makefile (et l'extension, je pense que c'est .mk?) Pour compiler un ensemble de fichiers .cpp (source C++) et .h (en-tête) dans une bibliothèque statique (.dll). Dire que j'ai un ensemble variable de fichiers:Makefile pour compiler un certain nombre de .cpp et .h dans une lib

  • file1.cpp
  • file1.h

  • file2.cpp

  • file2.h

  • file3.cpp

  • file3.h

  • ....

Quel serait le format makefile (et extension) pour compiler ces derniers dans une bibliothèque statique? (Je suis très nouveau pour makefiles) Quel serait le moyen le plus rapide de faire cela?

Répondre

2

L'extension ne serait pas du tout, et le fichier est appelé Makefile si vous voulez que GNU make le trouve automatiquement.

Make a des variables automatiques qui, à elles seules, vous permettent de contrôler une grande partie du processus de construction à partir de fichiers C/C++. Ces variables comprennent CC, CPP, CFLAGS, CPPFLAGS, CXX, CXXFLAGS et LDFLAGS. Ceux-ci contrôleront les commutateurs vers le préprocesseur C/C++, le compilateur, l'objet de plateforme et l'éditeur de programme (le programme qui génère ce que l'on appelle "programme exécutable" ou "le programme que vous compilez"). GNU make inclut également un grand nombre de règles implicites conçues pour activer les programmes de construction à partir du code source C/C++, vous n'avez donc pas besoin de les écrire de zéro.

Par exemple, même sans un makefile, si vous essayez make foobar, GNU Make tentera d'abord construire foobar.o de foobar.c ou foobar.cpp si elle trouve soit, en invoquant le compilateur approprié, puis tentera de construire foobar par l'assemblage (y compris la liaison) ses parties des bibliothèques système et foobar.o. Bref, GNU Make sait comment construire le programme foobar même sans makefile - grâce à des règles implicites. Vous pouvez voir ces règles en appelant Make avec le commutateur -p, par ex. make -p. Certaines personnes préfèrent s'appuyer sur GNU Rendre la base de données de règles implicite pour avoir des makefiles maigres et courts où seule la spécificité de leur projet est spécifiée, tandis que d'autres peuvent aller jusqu'à désactiver toute la base de données des règles implicites (-r) et avoir le contrôle total du processus de construction en spécifiant tout à partir de zéro. Je ne ferai aucun commentaire sur la validité de l'une ou l'autre stratégie, mais rassurez-vous, les deux font du travail dans une certaine mesure.

2

Il y a beaucoup d'options que vous pouvez définir lors de la construction d'une dll, mais voici une commande de base que vous pouvez utiliser si vous le faites à partir de la ligne de commande:

gcc -shared -o mydll.dll file1.o file2.o file3.o 

Et voici un makefile (généralement appelé Makefile) qui gère l'ensemble du processus de construction:

# You will have to modify this line to list the actual files you use. 
# You could set it to use all the "fileN" files that you have, 
# but that's dangerous for a beginner. 
FILES = file1 file2 file3 

OBJECTS = $(addsuffix .o,$(FILES)) # This is "file1.o file2.o..." 

# This is the rule it uses to assemble file1.o, file2.o... into mydll.dll 
mydll.dll: $(OBJECTS) 
    gcc -shared $^ -o [email protected] # The whitespace at the beginning of this line is a TAB. 

# This is the rule it uses to compile fileN.cpp and fileN.h into fileN.o 
$(OBJECTS): %.o : %.cpp %.h 
    g++ -c $< -o [email protected]   # Again, a TAB at the beginning. 

maintenant pour construire mydll.dll, il suffit de taper "make".

Quelques notes. Si vous tapez "make" sans spécifier le makefile ou la target (la chose à construire), Make essaiera d'utiliser le makefile par défaut ("GNUMakefile", "makefile" ou "Makefile") et la cible par défaut (le premier un dans le fichier makefile, dans ce cas mydll.dll).