Introduction à gcc/g++

De UnixManiax
Révision datée du 5 mars 2014 à 12:03 par AdminWiki (discussion | contributions)
(diff) ← Version précédente | Voir la version actuelle (diff) | Version suivante → (diff)
Aller à la navigation Aller à la recherche


Introduction à gcc/g++

Je ne suis pas un programmeur chevronné, cette rubrique sera donc très brève. Pour programmer en C/C++ sous GNU/Linux, il existe des logiciels tout intégrés avec une belle interface graphique comme les Borland C++ Builder ou autre Windev sous windows. Le plus connu sous Linux étant KDevelop.

Les puristes préfèreront programmer directement avec un éditeur en mode texte tels vi et emacs (installés par défaut sur la quasi-totalité des distributions linux). Le compilateur C/C++ utilisé en mode texte est gcc. Son utilisation est déroutante pour celui qui n'a programmé que sous windows, mais relativement simple, comme nous allons le voir.

Supposons que nous ayons un programme helloworld.c que nous voulons compiler et rendre exécutable (c'est souvant ce qu'on fait d'un fichier *.c ;-).

La syntaxe pour le compiler avec gcc est :

gcc -c helloworld.c 

puis

gcc -o helloworld helloworld.o

On peut faire encore plus simple en mettant tout dans une seule ligne (mais dans ce cas le fichier helloworld.o ne sera pas créé) :

gcc -c helloworld.c -o helloworld

Nous avons alors notre exécutable helloworld qui est créé (les exécutables n'ont traditionnellement pas d'extention sous linux, mais vous pouvez l'appeller .exe ou .toto si ça vous plait, linux ne fera aucune différence).

Si le programme helloworld n'était pas encore créé, il faut préciser à Linux qu'il s'agit d'un exécutable. Pour cela on va taper :

chmod +x helloworld

Et maintenant on peut lancer notre programme :

./helloworld

Le ./ indique que le programme se trouve dans le répertoire courant. On peut aussi le lancer en donnant le chemin compler, exemple :

/home/fred/prog/helloworld

Voyons maintenant un exemple concret. Voici le contenu de helloworld.c

#include <stdlib.h> 			

int main(void) 			
{ 			
  printf("%s", "hello world !\n\r"); 			
  return 0; 			
}

Maintenant on obtient en ligne de commande :

$ gcc -c helloworld.c 			
$ gcc -o helloworld helloworld.o 			
$ chmod +x helloworld 			
$ ./helloworld 			
hello world ! 			
$

Pour programmer en C++, on fait exactement la même chose en remplaçant gcc par g++. La différence, c'est qu'ils ne vont pas chercher les bibliothèques *.h dans le même répertoire.

Voilà, maintenant vous êtes capables de créer des programmes simples en C/C++.


Quelques options de compilation

  • -L /répertoire : répertoire où aller chercher des bibliothèques. Exemple : -L/usr/local/ssl/lib
  • -l bibliothèque : bibliothèque à ajouter. Exemple : -lssl -lcrypto -lnsl -lsocket
  • -static : compile en mettant toutes les bibliothèques en statique dans le binaire. Nécessite que toutes les bibliothèques en .a soient présentes. Pour ne mettre que quelques bibliothèques en statique, voir ligne suivante.
  • /repertoire/nom_bibliotheque.a : en passant une bibliothèque en argument (pas de tiret comme les options), on va la mettre en statique dans le binaire. Exemple : /usr/local/ssl/lib/libssl.a


Pour aller plus loin

Il existe des tonnes d'options qu'on peut passer à gcc, pas toutes forcément simples. De plus, il peut être vite agaçant de devoir retaper ces commandes à chaque fois qu'on veut tester une modification de son programme, surtout si on développe un projet contenant de nombreux fichiers liés entre eux. Pour simplifier la vie du programmeur qui veut créer de gros projets, beaucoups plus ambitieux que notre helloworld d'exemple, on va créer un makefile. C'est un fichier qui contient toutes les options de compilation du projet et qui est capable de ne lancer la compilation que des fichiers qui en ont besoin.

Il n'est pas forcément aisé de créer un tel fichier, surtout quand le projet se complexifie, mais une fois que c'est fait, un simple appel à la commande make va tout compiler sans vous demander le moindre argument. On voit tout de suite son intérêt.

Je ne m'aventurerai pas à vous en dire plus sur le sujet, j'en suis parfaitement incapable ;-).

Bonne programmation !