web-dev-qa-db-fra.com

Utiliser G ++ pour compiler plusieurs fichiers .cpp et .h

Je viens d'hériter du code C++ mal écrit avec un fichier cpp contenant la fonction principale et de nombreuses autres fonctions. Il existe également des fichiers .h contenant les classes et leurs définitions de fonctions.

Jusqu'à présent, le programme était compilé à l'aide de la commande g++ main.cpp. Maintenant que j'ai séparé les classes en fichiers .h et .cpp dois-je utiliser un fichier makefile ou puis-je quand même utiliser la commande g++ main.cpp?

142
Meir

liste tous les autres fichiers cpp après main.cpp.

c'est à dire

g++ main.cpp other.cpp etc.cpp

etc.

Ou vous pouvez les compiler tous individuellement. Vous liez ensuite tous les fichiers ".o" résultants.

189
Goz

Pour compiler séparément sans lier, vous devez ajouter l’option -c:

g++ -c myclass.cpp
g++ -c main.cpp
g++ myclass.o main.o
./a.out
44
FredAKA

Maintenant que j'ai séparé les classes en fichiers .h et .cpp, dois-je utiliser un fichier makefile ou puis-je quand même utiliser la commande "g ++ main.cpp"?

Compiler plusieurs fichiers à la fois est un mauvais choix si vous voulez le mettre dans le Makefile.

Normalement dans un Makefile (pour GNU/Make ), il devrait suffire d’écrire ceci:

# "all" is name of the default target, running "make" without params would use it
all: executable1

# for C++, replace CC (c compiler) with CXX (c++ compiler) which is used as default linker
CC=$(CXX)

# tell which files should be used, .cpp -> .o make would do automatically
executable1: file1.o file2.o

De cette façon, make recompilerait correctement uniquement ce qui doit être recompilé. On peut également ajouter quelques modifications pour générer les dépendances du fichier d'en-tête - afin que make reconstruise également correctement ce qui doit être reconstruit en raison des modifications apportées au fichier d'en-tête.

20
Dummy00001

Vous pouvez toujours utiliser g ++ directement si vous voulez:

g++ f1.cpp f2.cpp main.cpp

où f1.cpp et f2.cpp sont les fichiers avec les fonctions qu'ils contiennent. Pour plus de détails sur l'utilisation de make pour la construction, voir l'excellent documentation de GNU make .

10
anon

Je sais que cette question a été posée il y a des années mais je voulais toujours partager comment je compile habituellement plusieurs fichiers c ++.

  1. Supposons que vous avez 5 fichiers cpp. Tout ce que vous avez à faire est d’utiliser le * au lieu de taper chaque nom de fichier cpp E.g g++ -c *.cpp -o myprogram.
  2. Cela générera "myprogram"
  3. lancer le programme ./myprogram

c'est tout!!

La raison pour laquelle j'utilise * est que si vous avez 30 fichiers cpp, vous les taperiez tous? ou utilisez simplement le signe * et gagnez du temps :)

p.s Utilisez cette méthode uniquement si vous vous moquez de makefile.

6
zobair

Les fichiers .h n'auront rien à voir avec la compilation ... vous ne vous souciez que des fichiers cpp ... alors tapez g++ filename1.cpp filename2.cpp main.cpp -o myprogram

signifie que vous compilez chaque fichier cpp et que vous les liez ensuite ensemble dans myprgram.

puis lancez votre programme ./myprogram

5
Matthew

Vous pouvez utiliser plusieurs commandes g ++, puis link, mais le plus simple est d'utiliser un Makefile traditionnel ou un autre système de construction: comme Scons (qui sont souvent plus faciles à configurer que les Makefiles).

4
gauteh

J'avais l'habitude d'utiliser un Makefile personnalisé qui compilait tous les fichiers du répertoire en cours, mais je devais le copier dans tous les répertoires dont j'avais besoin, à chaque fois.

J'ai donc créé mon propre outil - niversal Compiler , ce qui a rendu le processus beaucoup plus facile lors de la compilation de nombreux fichiers.

1
Shubham Chaudhary

Comme rebenvp a dit que j'ai utilisé:

g++ *.cpp -o output

Et puis cela pour la sortie:

./output

Mais une meilleure solution consiste à utiliser le fichier make. Lisez ici pour en savoir plus sur les fichiers make.

Assurez-vous également que vous avez ajouté les fichiers .h requis dans les fichiers .cpp.

1
Pritam Banerjee