GNU/Linux >> Tutoriels Linux >  >> Linux

Options de ligne de commande GCC peu courantes mais utiles

Les outils logiciels offrent généralement plusieurs fonctionnalités, mais - comme la plupart d'entre vous en conviendront - toutes leurs fonctionnalités ne sont pas utilisées par tout le monde. De manière générale, il n'y a rien de mal à cela, car chaque utilisateur a ses propres exigences et n'utilise les outils que dans ce domaine. Cependant, il est toujours bon de continuer à explorer les outils que vous utilisez car vous ne savez jamais quand l'une de leurs fonctionnalités pourrait être utile, ce qui vous fera gagner un temps précieux dans le processus.

Exemple :les compilateurs. Un bon compilateur de langage de programmation offre toujours une pléthore d'options, mais les utilisateurs connaissent et n'utilisent généralement qu'un ensemble limité. Plus précisément, si vous êtes développeur en langage C et que vous utilisez Linux comme plate-forme de développement, il est fort probable que vous utilisiez le compilateur gcc, qui offre une liste interminable d'options de ligne de commande.

Savez-vous que si vous le souhaitez, vous pouvez demander à gcc de sauvegarder la sortie à chaque étape du processus de compilation ? Connaissez-vous le -Mur option que vous utilisez pour générer des avertissements ne couvre pas certains avertissements spécifiques ? Il existe de nombreuses options gcc en ligne de commande qui ne sont pas couramment utilisées, mais qui peuvent être extrêmement utiles dans certains scénarios, par exemple lors du débogage du code.

Ainsi, dans cet article, nous couvrirons quelques-unes de ces options, en offrant tous les détails requis et en les expliquant à l'aide d'exemples faciles à comprendre chaque fois que nécessaire.

Mais avant d'aller de l'avant, veuillez garder à l'esprit que tous les exemples, commandes et instructions mentionnés dans ce didacticiel ont été testés sur Ubuntu 16.04 LTS et que la version de gcc que nous avons utilisée est la 5.4.0.

 

Voir la sortie intermédiaire à chaque étape de compilation

Savez-vous qu'il y a, en gros, un total de quatre étapes par lesquelles votre code C passe lorsque vous le compilez à l'aide du compilateur gcc ? Il s'agit du prétraitement, de la compilation, de l'assemblage et de la liaison. Après chaque étape, gcc produit un fichier de sortie temporaire qui est transmis à l'étape suivante. Maintenant, ce sont tous des fichiers temporaires qui sont produits, et donc nous ne les voyons pas - tout ce que nous voyons, c'est que nous avons émis la commande de compilation et qu'elle produit le binaire/exécutable que nous pouvons exécuter.

Mais supposons, si lors du débogage, il est nécessaire de voir à quoi ressemble le code après, disons, l'étape de prétraitement. Alors, que feriez-vous ? Eh bien, la bonne chose est que le compilateur gcc offre une option de ligne de commande que vous pouvez utiliser dans votre commande de compilation standard et vous obtiendrez sinon les fichiers intermédiaires qui sont supprimés par le compilateur. L'option dont nous parlons est -save-temps .

Voici ce que dit la page de manuel de gcc à propos de cette option :

           Store the usual "temporary" intermediate files permanently; place
           them in the current directory and name them based on the source
           file.  Thus, compiling foo.c with -c -save-temps produces files
           foo.i and foo.s, as well as foo.o.  This creates a preprocessed
           foo.i output file even though the compiler now normally uses an
           integrated preprocessor.

           When used in combination with the -x command-line option,
           -save-temps is sensible enough to avoid over writing an input
           source file with the same extension as an intermediate file.  The
           corresponding intermediate file may be obtained by renaming the
           source file before using -save-temps.

Voici un exemple de commande qui vous donnera une idée de la façon dont vous pouvez utiliser cette option :

gcc -Wall -save-temps test.c -o test-exec

Et c'est ainsi que j'ai vérifié que tous les fichiers intermédiaires ont bien été produits après l'exécution de la commande mentionnée ci-dessus :

Ainsi, comme vous pouvez le voir dans la capture d'écran ci-dessus, le test.i , test.s , et test.o les fichiers ont été produits par le -save-temps option. Ces fichiers correspondent respectivement aux étapes de prétraitement, de compilation et de liaison.

Préparez le débogage et le profilage de votre code

Il existe des outils dédiés qui vous permettent de déboguer et de profiler votre code source. Par exemple, gdb est utilisé à des fins de débogage, tandis que gprof est un outil populaire à des fins de profilage. Mais savez-vous qu'il existe des options de ligne de commande spécifiques proposées par gcc afin de préparer le débogage de votre code ainsi que le profilage ?

Commençons par le débogage. Pour pouvoir utiliser gdb pour le débogage de code, vous devrez compiler votre code en utilisant le -g L'option de ligne de commande fournissait le compilateur gcc. Cette option permet essentiellement à gcc de produire les informations de débogage requises par gdb pour déboguer avec succès votre programme.

Si vous envisagez d'utiliser cette option, il vous est conseillé de consulter les détails de la page de manuel de gcc sur cette option - certains d'entre eux peuvent s'avérer vitaux dans certains cas. Par exemple, voici un extrait tiré de la page de manuel :

           GCC allows you to use -g with -O.  The shortcuts taken by optimized
           code may occasionally produce surprising results: some variables
           you declared may not exist at all; flow of control may briefly move
           where you did not expect it; some statements may not be executed
           because they compute constant results or their values are already
           at hand; some statements may execute in different places because
           they have been moved out of loops.

           Nevertheless it proves possible to debug optimized output.  This
           makes it reasonable to use the optimizer for programs that might
           have bugs.

Pas seulement gdb, compiler votre code en utilisant le -g L'option ouvre également la possibilité d'utiliser l'outil memcheck de Valgrind à son plein potentiel. Pour ceux qui ne le savent pas, memcheck est utilisé par les programmeurs pour vérifier les fuites de mémoire (le cas échéant) dans leur code. Vous pouvez en savoir plus sur cet outil ici.

Ensuite, pour pouvoir utiliser gprof pour le profilage de code, vous devez compiler votre code en utilisant le -pg option de ligne de commande. Cela permet à gcc de générer du code supplémentaire pour écrire des informations de profilage, qui sont requises par gprof pour l'analyse de code. "Vous devez utiliser cette option lors de la compilation des fichiers source sur lesquels vous souhaitez obtenir des données, et vous devez également l'utiliser lors de la liaison", indique la page de manuel gcc. Pour en savoir plus sur la façon d'effectuer le profilage de code à l'aide de gprof, consultez ce tutoriel dédié sur notre site Web.

Remarque :Utilisation des deux -g et -pg options est similaire à la façon dont -save-temps option a été utilisée dans la section précédente.

Conclusion

À moins que vous ne soyez un pro de gcc, je suis sûr que vous avez appris quelque chose de nouveau avec cet article. Essayez ces options et voyez comment elles fonctionnent. En attendant, attendez la prochaine partie de cette série de didacticiels dans laquelle nous discuterons d'options de ligne de commande gcc plus intéressantes et utiles.


Linux
  1. 12 exemples de commandes Wget utiles sous Linux

  2. Options ps utiles

  3. Options Su - Exécuter la commande en tant qu'autre utilisateur ?

  4. Expliquer les options de la commande Readlink ?

  5. Clonezilla depuis la ligne de commande

10 astuces de ligne de commande Linux utiles pour les débutants - Partie 2

Commande Diff sous Linux

Maîtrisez la ligne de commande Linux

Principes de base de la ligne de commande Linux :sudo

Options de ligne de commande Thunar ?

19 trucs et astuces utiles pour la ligne de commande Linux