Compilation manuelle




Préparatifs


Avant de commencer à approfondir vos connaissances en C  je vous propose de faire une pause. Quand je dis une pause, c'est de lire un chapitre simple bien imagé .


Vous avez toujours rêvé de compiler un fichier *.C sans utiliser d'IDE ? Ce chapitre est fait pour vous !


Vous allez apprendre à compiler manuellement, sans Code::Blocks. Nous n'allons pas apprendre le langage machine et le langage assembleur (heureusement, je n'ai pas envie d'écrire 10 chapitres pour ça, et je ne les connais même pas) mais nous allons nous servir du compilateur GCC sans Code::Blocks bien entendu, avec l'Invite de commandes Windows !


Quelques explication s'imposent, en installant Code::Blocks, un dossier nommé MinGW s'est infiltré dans votre ordinateur !


MinGW n'est pas un compilateur mais une adaptation du compilateur GCC pour Windows !


On peut trouver dans ce dossier l'exécutable gcc.exe. C'est grâce à lui que l'on peut compiler en C .


Tous les autres exécutables (presque tous) sont appelés par GCC, c'est donc lui la source, le chef, on s'en fou des autres .


Vous allez découvrir un schéma encore plus complet d'une compilation (rassurez-vous, juste l'assembleur sera nouveau, je ne vous demanderai même pas de le retenir).


Nous allons donc utiliser l'exécutable gcc.exe pendant ce chapitre pour compiler manuellement.


Si vous l'ouvrez, rien ne se passe, rassurez-vous, c'est tout à fait normal.







Comment on utilise gcc.exe alors !


Doucement j'y viens ! Tapez gcc dans l'Invite de commandes et observez le message d'erreur qui suit...

'gcc' n'est pas reconnu en tant que commande interne

ou externe, un programme exécutable ou un fichier de commandes.


Nous allons donc modifier la variable d'environnement %PATH% pour que cette commande gcc fonctionne dans tous les cas !


Le PATH


Ne vous inquiétez pas, je sais que vous n'avez rien compris .


Vous savez ce qu'est une variable, bien ici, une variable d'environnement c'est une variable toujours présente sur le système d'exploitation, elle se nomme %PATH% sous Windows et $PATH sous Unix.


Pour afficher (echo) sa valeur (%PATH%), il faut ouvrir l'Invite de commandes et écrire la commande Batch suivante :

echo %PATH%


C'est toujours utile un peu de culture Batch , vous pouvez aller lire mon tutoriel si vous voulez mieux maitriser l'Invite de commandes, c'est plus facile que le C si ça peut vous rassurer.


Observez bien le résultat, vous devez obtenir quelque chose de ce genre :





Il y a des chemins (des URL) entre chaque point-virgule ! Par exemple C:\Windows\system32.


Qu'est ce que ça veut dire concrètement ? C'est que l'on peut accéder à tous les éléments de ce dossier sans avoir besoin du chemin !


Par exemple, cmd.exe se trouve dans C:\Windows\system32, donc si vous faites dans l'Invite de commandes :

start cmd


Le programme cmd.exe va s'ouvrir ! En résumé, le PATH est une liste de tous les dossiers par défaut.


Si un exécutable n'est pas placé dans l'un de ces répertoires, il sera nécessaire d'indiquer le chemin exact chaque fois qu'on l'appellera. C'est donc l'avantage du PATH.


Attends pourquoi tu as pas mis l'extension de cmd ?


Il existe aussi la variable %PATHEXT% dont sa valeur est une liste d'extensions. C'est exactement le même principe que %PATH%, ce sont les extensions par défaut.


Maintenant que vous savez ce qu'est le PATH, nous allons le modifier !


 Appuyez simultanément sur les touches "Windows" + "Pause" de votre clavier. Remarque : sur certains claviers (en général ceux des ordinateurs portables), la fonction "Pause" nécessite l’usage de la touche "Fonction" ou "Fn". 


Dans ce cas appuyez sur les touches "Windows" + "Fn" + "Pause".






Cliquez sur l'onglet Avancé (il est bien caché ce PATH).




Et enfin cliquez sur paramètres système avancé Variables d'environnement... (ça ne vous rappelle rien ).





Dans Variables système, vous retrouvez Path et PATHEXT, c'est le PATH que nous voulons modifier, sélectionnez donc Path et cliquez sur Modifier....


Nous n'avons pas besoin de modifier la valeur de %PATHEXT% puisque l'extension de gcc.exe y est déjà présente.





Notre but est d'accéder facilement à gcc.exe et à toutes ses dépendances, il suffit donc d'ajouter le chemin du dossier bin de MinGW sans oublier un point-virgule à la fin comme ci-dessous. Enfin pas tout à fait comme ci dessous, ça dépend de où est installé CodeBlock sur votre PC.




Cliquez sur OK et c'est terminé nous sommes prêts à compiler !




GCC


Nous allons maintenant compiler avec GCC ! Plus le droit d'utiliser Code::Blocks sinon j'applique un gage .


main.c


Nous allons créer un fichier main.c.


Commencez par créer un nouveau fichier pour écrire du code source dedans.


Je pense qu'un Document texte suffit.


Pour écrire votre code source, vous pouvez utiliser Notepad++ ou alors le Bloc-notes Windows (Modifier).


Pour cet exemple, j'ai utilisé le Bloc-notes. J'ai écrit un code source ayant pour but d'afficher Salut tout le monde ! à l'écran.


Notez la ligne vide en bas du document, elle sert à éviter des warnings, en effet, oublier cette ligne peut faire broncher le compilateur.




N'oubliez pas d'enregistrer votre fichier en *.C et non en *.TXT.


Pour le nom de votre fichier, j'ai choisi main.c pour rester aux normes.





Pour ceux qui ont Notepad++, vous pouvez modifier ce fichier en cliquant sur Edit with Notepad++, vous bénéficierez d'une coloration syntaxique ! C'est le gros avantage de Notepad++ .





Bravo, vous avez créer un fichier *.C sans Code::Blocks !


La compilation


Passons à la compilation via l'Invite de commandes, commencez par ouvrir cette dernière.


Placez-vous sur le bureau pour travailler aisément.



Pour finir tapez gcc, s'il vous affiche no input files c'est que c'est bon, gcc.exe est reconnu !


Si vous tapez gcc main.c -E, vous verrez défiler tout le contenu de main.c après le passage du préprocesseur.


On peut donc dire que gcc.exe fait appel au préprocesseur (cpp.exe).



Comment récupérer ce contenu dans un fichier ? Bien en utilisant le chevron > du Batch !


Généralement, on utilise l'extension *.I pour stocker le contenu d'un fichier C après le passage du préprocesseur, je vais donc appeler mon fichier main.i.


Ce qui nous donne une commande de ce type :



Passons à la deuxième étape notre compilation, celle est vous n'avez encore jamais vu et qui est facultative à connaître.


On peut traduire le langage C en langage assembleur grâce au compilateur cc1.exe (le vrai, pas l'abus de langage).


L'assembleur est un langage que je trouve inutile (la preuve, je ne vous en ai même pas encore parlé) mais qui permet d'acquérir des informations plus poussées sur un programme.


Le langage assembleur est l'intermédiaire entre le langage C et le langage machine.


On peut traduire le C en assembleur grâce au paramètre -S.


En Batch, un paramètre est une information que l'on envoie à un exécutable, ici, on envoie le paramètre -S à gcc.exe...



Vous obtenez un fichier main.s en assembleur !


L'étape précédente peut s'avérer inutile mais nous essayons dans ce chapitre de faire une compilation manuelle étape par étape !


Maintenant que nous avons notre fichier main.s nous allons utiliser l'assembleur (c'est le programme as.exe) pour générer le fichier objet (main.o).


Pour se faire, il faut envoyer le paramètre -c à gcc.exe comme ci-dessous...



Une fois que vous avez votre fichier objet main.o il suffit d'utiliser gcc.exe sans lui envoyer de paramètres pour obtenir votre exécutable, le linker (ld.exe) sera automatiquement appelé !

Notez tout de même que vous pouvez utiliser le paramètre -o pour nommer votre exécutable.



Vous pouvez tester votre programme à l'aide de la commande start ou tout simplement en cliquant dessus .



Voilà, votre programme fonctionne aussi bien qu'avec Code::Blocks !


Si vous voulez compiler complètement (en une seule fois) le fichier main.c il suffit de faire comme ci-dessous !



Pour finir, un schéma récapitulatif.


La compilation est un abus de langage, ce n'est qu'une étape pour transformer des fichiers *.C et *.H en un exécutable :



Cette compilation ne fait pas intervenir les bibliothèques, mais si vous avez lu mes anciens schémas (du chapitre 3), je pense que vous êtes capables d'anticiper. Je ne tiens pas à vous embrouiller.


Le problème, c'est qu'on ne connait pas les informations de compilation (comme les warnings).


Les warnings


Je rappelle qu'un warning signifie que le code est ambigu et que le code peut être interprété différemment d'un compilateur à l'autre, mais l'exécutable peut être créé.


Il vaut mieux essayer de coder de sorte à n'avoir ni erreur, ni warning.


On va provoquer un warning pour voir .



J'espère que vous avez remarqué l'erreur !


J'ai enlevé les directives de préprocesseur, le mode d'emploi des fonctions printf et system !


On fait une compilation rapide pour observer le résultat et...



Bam ! Aucune erreur ou warning ! Diablerie ! Comment c'est possible ?


Bonne nouvelle, moi je sais pourquoi. Pour afficher les warnings, utilisez le paramètre -Wall (W comme Warnings).



Nous verrons plus tard pourquoi le programme fonctionne.


Il faut toujours éviter les warnings, surtout lors d'une compilation manuelle.


Je vous conseille tout de même d'utiliser Code::Blocks, il ne l'ont pas développés pour rien.


Programme Batch


Pour finir, un petit bonus pour ceux qui aiment le Batch.


On va créer un programme Batch qui crée et exécute un programme en C !



Voilà, n'oubliez pas le caractère ^ pour échapper des caractères comme le chevron ou l'espace.



C'est terminé, vous savez maintenant compiler sans Code::Blocks, vous rencontrerez sûrement des programmeurs vous parlant de GCC, vous saurez donc ce qu'ils veulent dire , un peu de culture ne fait pas mal même si ce chapitre reste plus ou moins facultatif.


Vous n'avez vu qu'une partie de la compilation manuelle avec GCC, je ne vais pas m'éterniser sur ce chapitre puisque je ne le juge pas essentiel, c'est juste bon pour la culture.

Créé avec HelpNDoc Personal Edition: Créer des sites web d'aide facilement