Utilisation de G ++ pour compiler plusieurs fichiers .cpp et .h

172

Je viens d'hériter d'un code C ++ qui a été mal écrit avec un fichier cpp qui contenait le principal et un tas d'autres fonctions. Il existe également des .hfichiers contenant des classes et leurs définitions de fonction.

Jusqu'à présent, le programme était compilé à l'aide de la commande g++ main.cpp. Maintenant que j'ai séparé les classes .het les .cppfichiers, dois-je utiliser un makefile ou puis-je toujours utiliser la g++ main.cppcommande?

Meir
la source

Réponses:

224

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

c'est à dire

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

etc.

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

Goz
la source
152
Vous pouvez même faireg++ *.cpp -o output
rubenvb
7
Est-ce de toute façon une mauvaise pratique? J'aimerais utiliser ceci dans mon makefile.
gabriel_vincent
8
@gabriel_vincent, ce n'est pas forcément une mauvaise pratique, mais cela signifiera que l'édition d'un fichier dans un projet de centaines va obliger le compilateur à refaire tout le travail pour tous les fichiers. Compiler séparément permet une compilation incrémentielle.
Paul Draper
@gabriel_vincent Vous ne devriez pas écrire des makefiles à la main pour commencer. Utilisez plutôt un système de construction approprié comme CMake.
Baum mit Augen
3
@BaummitAugen Ouais, sauf que je veux juste compiler ce petit programme à 2 fichiers que j'ai écrit en 14 minutes, et je préfère vraiment passer 1 minute à écrire un makefile au lieu d'une heure pour configurer cmake.
Przemek D
55

Pour compiler séparément sans liaison, vous devez ajouter une -coption:

g++ -c myclass.cpp
g++ -c main.cpp
g++ myclass.o main.o
./a.out
FredAKA
la source
3
Notez que si vous souhaitez contrôler le nom de l'exécutable dans l'étape de liaison, faites simplement ce que vous faites habituellement:g++ -o my_executable myclass.o main.o
eric
22

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

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

Normalement dans un Makefile (pour GNU / Make ) il devrait suffire d'écrire que:

# "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, recompiler 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 - de sorte que make reconstruirait également correctement ce qui doit être reconstruit en raison des modifications du fichier d'en-tête.

Dummy00001
la source
13

Vous pouvez toujours utiliser g ++ directement si vous le souhaitez:

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

où f1.cpp et f2.cpp sont les fichiers contenant les fonctions. Pour plus de détails sur l'utilisation de make pour faire la compilation, consultez l'excellente documentation de GNU make .


la source
12

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. Disons que vous avez 5 fichiers cpp, tout ce que vous avez à faire est d'utiliser le * au lieu de taper le nom de chaque fichier cpp 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, les taperiez-vous tous? ou utilisez simplement le signe * et gagnez du temps :)

ps N'utilisez cette méthode que si vous ne vous souciez pas de makefile.

Zobair
la source
1
Une erreur de redéfinition se produit lorsque j'utilise cette approche? Y a-t-il une autre façon de faire de même?
Waseem Ahmad Naeem
11

.h les fichiers n'ont 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, puis que vous les liez ensemble dans myprgram.

puis lancez votre programme ./myprogram

Matthieu
la source
7

Comme rebenvp l'a dit, j'ai utilisé:

g++ *.cpp -o output

Et puis faites ceci pour la sortie:

./output

Mais une meilleure solution consiste à utiliser un makefichier. Lisez ici pour en savoir plus surmake fichiers.

Assurez-vous également que vous avez ajouté les .hfichiers requis dans les .cppfichiers.

Pritam Banerjee
la source
4

Vous pouvez utiliser plusieurs commandes g ++ puis lier, 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 Makefiles).

Gauteh
la source
2

Si vous souhaitez utiliser #include <myheader.hpp>dans vos fichiers cpp, vous pouvez utiliser:

g++ *.cpp -I. -o out
Matias Haeussler
la source
1

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

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

Shubham Chaudhary
la source
-4

~ / In_ProjectDirectory $ g ++ coordin_main.cpp coordin_func.cpp coordin.h

~ / In_ProjectDirectory $ ./a.out

... Travaillé!!

Utilisation de Linux Mint avec Geany IDE

Lorsque j'ai enregistré chaque fichier dans le même répertoire, un fichier n'était pas enregistré correctement dans le répertoire; le fichier coordin.h. Donc, revérifié et il a été enregistré là sous coordin.h, et pas incorrectement sous -> coordin.h.gch. Les petites choses. Arg !!

Tim Conroy
la source
3
Vous obtenez un vote négatif car vous avez inclus des fichiers h, ce qui est une erreur.
eric