web-dev-qa-db-fra.com

Différence entre Cmake, gnu make et compilation manuelle

Je suis nouveau dans la programmation, c'est donc une question plus abstraite que technique. J'ai utilisé des IDE pour apprendre, mais j'ai entendu dire qu'ils avaient tendance à simplifier à l'excès le fait de compiler, assembler et lier lors de la création d'un fichier exécutable.

J'essaie de télécharger et de compiler une bibliothèque sans compter sur un IDE (dans ce cas librocket). J'ai d'abord dû utiliser Cmake pour créer les binaires. Après avoir configuré et généré, je n'ai pas fait '' Je ne vois aucun fichier objet ou fichier .cpp dans le répertoire de sortie. J'ai ensuite dû utiliser la commande gnu make qui a ensuite créé à la fois les fichiers objet et les fichiers .cpp dans le répertoire de sortie.

Quelles étapes du téléchargement du code source à la création effective des fichiers objets Cmake et gnu font-ils? À quel moment le compilateur et l'éditeur de liens sont-ils réellement appelés?

J'ai réussi à compiler une bibliothèque de test que j'ai écrite, puis à compiler un autre programme qui y est lié en utilisant g ++ mais je suis un peu perdu parce que je dois utiliser Cmake et gnu make au lieu d'appeler directement un compilateur.

29
kristhedemented

Cmake est un "générateur de projet". Il ne construit en fait aucun fichier objet, etc .; ce qu'il fait est de générer les fichiers de contrôle pour d'autres outils (tels que GNU make) qui construiront les fichiers objets, etc.

L'avantage d'utiliser cmake au lieu d'écrire directement le makefile est que, en utilisant le même fichier d'entrée cmake, cmake peut générer des fichiers de projet pour toutes sortes d'outils de contrôle de construction différents: en plus des makefiles, il peut générer des fichiers de projet Xcode (Mac OS X) , Des fichiers de projet Microsoft Visual Studio et des fichiers de contrôle pour d'autres outils comme Ninja. Si vous écrivez un logiciel qui doit être construit sur de nombreuses plates-formes différentes, cmake est souvent un bon choix.

Pour votre situation, cela se passe comme suit: cmake génère un ensemble de makefiles (uniquement). Vous ne le faites généralement qu'une seule fois lorsque vous disposez d'un espace de travail propre. Ensuite, vous exécutez make qui utilise ces makefiles pour appeler le compilateur selon les besoins, lorsque divers fichiers changent. Les makefiles ont également des règles pour réexécuter cmake lui-même si l'un des fichiers d'entrée cmake change.

27
MadScientist

Lorsque vous compilez un grand projet avec beaucoup de fichiers, vous pouvez vous perdre si vous appelez directement le compilateur.

Bien sûr, vous pouvez placer les commandes associées dans un script et l'exécuter, mais vous devez ensuite mettre à jour le script si vous ajoutez/supprimez un fichier. Dans ce cas également, vous souhaiterez peut-être ne pas tout recompiler à chaque fois que vous effectuez une petite modification, vous devez donc uniquement compiler les parties qui ont été modifiées. Si vous ajoutez cette fonctionnalité (et d'autres qualité de vie) dans votre script hyphotétique, vous allez réinventer make.

make est conçu pour exécuter uniquement la compilation des parties de votre code qui ont été modifiées jusqu'à votre dernier appel à make. Il vous permet également d'automatiser l'ajout de fichiers sources, etc.

Cependant, si vous voulez que votre code fonctionne avec plusieurs compilateurs différents et sur plusieurs plates-formes différentes, et qu'il soit lié à différentes bibliothèques, etc., les choses se compliquent un peu pour make. Vous pouvez toujours le faire, mais c'est beaucoup de travail. C'est là que cmake vient.

cmake crée des makefiles (ou des systèmes de build similaires, exemple: Visual Studio) pour le système que vous souhaitez. cmake a des profils prédéfinis pour différents compilateurs et systèmes qui trouveront automatiquement le bon ensemble de drapeaux de compilation, trouver un lien vers les bibliothèques correctes et ainsi de suite.

Bien sûr, si vous écrivez un "Hello World!" ou un programme similaire dont vous n'avez pas besoin ni make ni cmake. Si vous n'avez pas besoin de prendre en charge plusieurs compilateurs/plates-formes, vous n'avez pas besoin de cmake. Si vous travaillez sur une énorme bibliothèque/application, make et cmake vous aideront à faire les choses plus facilement.

0
Dimitar Slavchev