Aide gcc

Résolu/Fermé
Acawa - 26 août 2007 à 15:36
Zempachi Messages postés 7472 Date d'inscription vendredi 14 octobre 2005 Statut Contributeur Dernière intervention 5 juin 2020 - 3 sept. 2007 à 16:06
Bonjour je vient de passer sous linux et je suis entrein d'apprendre le c.
compiler etc.. j'entend toujours parler de gcc, mais je ne comprend rien a son fonctionnement.
Comment on fait pour l'installer, pour l'utiliser, et les fichier que l'on veut compiler on les écrit avec quoi ? le traitement de texte ?
sinon je suis sous mandriva linux one 2007 spring.
Mercie de vos réponse.

16 réponses

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
27 août 2007 à 00:20
A) Introduction

On va commencer avec juste un fichier pour commencer.

1) On va écrire un fichier de sources (fichier .c). C'est à partir de fichier source qu'on génére un binaire (module, librairie, exécutable... quelque chose que l'ordinateur peut manipuler directement). Ce premier fichier de source (par exemple main .c) doit impérativement comporter un main sinon il n'est pas possible d'en faire un exécutable. En effet, la fonction main est chargée au lancement du programme. Il est donc impératif d'en avoir une (et une seule !). Exemple
#include <stdio.h> // <--- Ceci est une inclusion de header. Il permet d'utiliser diverses fonctions, par exemple printf

int main(){
  printf("plop !\n"); // j'écris plop !, le \n signifie retour à la ligne
  return 0; // la fonction main est sensée retournée 0 quand tout s'est bien passé
}

Remarque :

Sous linux il est possible d'avoir la documentation de chaque fonction standard du langage C avec la commande man 3. Pour quitter appuies sur q. Exemple :
(mando@aldur) (~) $ man 3 printf

Dans cet exemple on voit en particulier qu'il faut inclure stdio.h pour pouvoir utiliser printf :
PRINTF(3)                 Manuel du programmeur Linux                PRINTF(3)

NOM
       printf,   fprintf,  sprintf,  snprintf,  vprintf,  vfprintf,  vsprintf,
       vsnprintf - Formatage des sorties

SYNOPSIS
       #include <stdio.h>
...

A noter que tu peux chercher directement les pages de man sur google.

2) A présent je peux compiler ce fichier dans une console avec gcc. Compiler signifie convertir un fichier source (ici main.c) en exécutable (par exemple plop.exe). Les options -W -Wall permettent d'afficher des warnings afin d'être sûr que le programme est plop. Un bon programme compile sans warning et doit impérativement compiler sans erreur (sinon l'exécutable n'est pas généré). On peut aussi ajouter l'option -o suivie du nom de l'exécutable, par exemple plop.exe :
gcc -W -Wall -o plop.exe main.c

3) A présent je peux exécuter mon programme :
(mando@aldur) (~) $ gcc -W -Wall -o plop.exe plop.c
(mando@aldur) (~) $ ./plop.exe
plop

4) Effectivement il a bien écrit plop :)

B) Les modules

Il est possible de travailler sur plusieurs fichiers. Chaque grande "fonctionnalité" correspond à un module. Par exemple si je décide de coder mes propres listes il peut être valable de faire un module liste en vue de le réutiliser dans d'autres programmes. De plus ça ne nuit pas à la clarté du code. Un module de comporte pas de main, il ne fait qu'implémenter des fonctions utilisées soit par un autre module, soit par un fichier comportant un main. Un module est généralement composé de deux fichiers :
- un fichier .h qui déclare les fonctions disponibles dans le fichier .c. Ces déclarations sont appelées "prototypes" et sont généralement accompagnés de commentaires permettant d'expliquer le rôle de la fonction et à quoi correspondent chaque paramètre
- le fichier .c implémente les fonctions déclarées dans le .h

Exemple :
1) Je crée un fichier mando_a_dit.h. Au cas ou ce header serait inclu en plusieurs endroit, il est nécessaire de mettre un verrou à l'aide de #ifndef / #define. En effet un programme ne peut comporter deux fonctions portant le même nom. Ainsi avec ce verrou, le fichier ne peut être qu'inclu qu'une fois.
#ifndef MANDO_A_DIT
#define MANDO_A_DIT

/**
 * \brief Ecrit "mando a dit de ..." suivi du message
 * \param msg Le message
 */
void mando_a_dit(const char *msg);

#endif

2) Il est à présent temps d'implémenter le code de la fonction "mando_a_dit". Pour celà je crée le fichier mando_a_dit.c :
#include "mando_a_dit.h" // attention à mettre des " " et pas des < >
#include <stdio.h> // par contre pour les headers standards on mets bien < >

void mando_a_dit(const char *msg){
  printf("mando a dit de %s",msg);
}

3) A présent je peux utiliser ma fonction mando_a_dit dans main.c, à condition d'inclure le header correspondant. main.c devient :
#include <stdio.h>
#include "mando_a_dit.h"

int main(){
    printf("plop\n");
    mando_a_dit("se coucher !\n");
    return 0;
}

4) Ok maintenant il ne reste plus qu'à compiler notre programme, composé des fichiers main.c, mando_a_dit.h et mando_a_dit.c. Pour compiler le module mando_a_dit il faut utiliser l'option -c, qui va générer un mando_a_dit.o.
(mando@aldur) (~) $ gcc -W -Wall mando_a_dit.o plop.c

Tu peux vérifier avec la commande ls que mando_a_dit.o est effectivement apparu. Ce fichier contient en fait le binaire associé aux fonctions de ce module. Il est nécessaire de faire ainsi pour chaque module. Pour compiler un fichier source, il faut l'assembler avec tous les .o qu'il utilise. En l'occurrence main.c utilise le module mando_a_dit.o. Le principe est exactement le même avec un module utilisant un autre module. Pour compiler main.c je dois donc taper ;
gcc -W -Wall -o plop.exe mando_a_dit.o main.c

Ce qui donne :
(mando@aldur) (~) $ gcc -W -Wall -o plop.exe mando_a_dit.o main.c
(mando@aldur) (~) $ ./plop.exe
plop
mando a dit de se coucher !


Remarque :
On a utilisé le header stdio.h, mais qu'a aucun moment on a utilisé un module stdio.o. C'est normal, car quand tu compiles tu utilises implicitement la lib C qui implémente les fonctions standards du C (par exemple dans /usr/lib/gcc/i486-linux-gnu/4.1.3/)/ De plus le headers est inclu avec des < > car le fichier stdio.h est dans un répertoire "standard" (par exemple /usr/include/stdio.h)

C) Les makefile

Tu l'auras compris dès qu'on commence à avoir plein de modules, cela devient assez fastidieux de compiler un programme. Heureusement il est possible de créer un fichier makefile permettant de faire toute la compilation sans se préoccuper des dépendances. Afin de ne pas te noyer je ne vais pas aborder cette notion tout de suite, mais dis toi juste que de manière générale en programmation, on a intérêt à découper au maximum.

Si tu as besoin d'éclaircissements, n'hésite pas à poser tes questions
En espérant t'avoir été utile, bonne chance !
3
bob031 Messages postés 8158 Date d'inscription samedi 7 août 2004 Statut Membre Dernière intervention 1 septembre 2014 472
27 août 2007 à 11:28
Bonjour,

Très chouette entrée en matière !
Merci beaucoup !

:-))
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
27 août 2007 à 12:32
Merci du compliment :)
J'espère que ça conviendra à Acawa également !
0
Mercie beaucoup bob031 pour ces explications très claire et précise, mais voila quand j'essaye de faire comme tu me la expliquer je me retrouve avec le message d'erreur
"bash: gcc: command not fond"
Je te souhaite bonne continuation car tes explications sont sinon très bonne.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
27 août 2007 à 23:34
Salut,

Mercie beaucoup bob031

Oups, tu ne fait pas une erreur?!
Rendre à César ce qui est à César et César cette fois c'est Miss mamiemando :-))

Bravo Miss,
                               .-~~~-
                          .-~~~_._~~~\
                          /~-~~   ~.  `._
                         /    \     \  | ~~-_
                 __     |      |     | |  /~\|
             _-~~  ~~-..|       ______||/__..-~~/
              ~-.___     \     /~\_________.-~~
                   \~~--._\   |             /
                    ^-_    ~\  \          /^
                       ^~---|~~~~-.___.-~^
                         /~^| | | |^~\
                        //~^`/ /_/ ^~\\
                        /   //~||      \
                           ~   ||
                    ___      -(||      __ ___ _
                   |\|  \       ||_.-~~ /|\-  \~-._
                   | -\| |      ||/   /  | |\- | |\ \
                    \__-\|______ ||  |    \___\|  \_\|
              _____ _.-~/|\     \\||  \  |  /       ~-.
            /'  --/|  / /|  \    \||    \ /          |\~-
           ' ---/| | |   |\  |     ||                 \__|
          | --/| | ;  \ /|  /    -(||
          `./  |  /     \|/        ||)-
            `~^~^                  ||


Il faut installer gcc.
urpmi gcc
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
28 août 2007 à 09:41
Yep comme a dit lami20j, installe tout simplement gcc. En root (dans une console super utilisateur) :
urpmi gcc

Merci du compliment lami20j ;)
0
Désolé mamiemando, je rend donc à César se qui lui appartient (mercie lami20j pour la citation). Je te remercie mamimando et mexcuse mille fois pour cette érreur.
Mais quand je rentre "urpmi gcc" il m'écrit "pas de packtage gcc" pourtant quand je vais dans systeme/installer, suprimer et mettre à jour des logiciels je trouve un packtage appeler gcc-cpp-4.1.2-1mdv2007.1.i586.
Déloler pour mes question de vraie débutant et mercie de prendre du temp pour me répondre.
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
29 août 2007 à 00:12
Oulà je suis pas du genre à me vexer pour si peu. L'essentiel c'est que ça t'aide.
Tes questions sont complètement fondées je suis surprise que mandriva n'ait pas un paquet appelé gcc.
Le mieux ce serait que tu cherches via l'interface graphique via laquelle tu installes habituellement tes logiciels, tu vas surement trouver gcc ou un nom approchant. Apparemment c'est ce que tu as fait et effectivement c'est peut être gcc-cpp, tu peux toujours essayer quitte à le virer par la suite si ce n'est pas ça. Connaissant très peu les mandrivas, je t'avoue que je ne peux pas trop t'aiguiller sur ce coup.

Bonne chance
0
Bon ben je vais essayer de me débrouiller ci jamais une idée te vient n'esites pas.
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
30 août 2007 à 00:28
Ben l'idée c'est que si tu passes sous kubuntu ou debian là je peux t'aider :) Mais après tu choisis la distribution qui te plaît, c'est juste que les mandrivas je ne maîtrise pas.

Bonne chance
0
bob031 Messages postés 8158 Date d'inscription samedi 7 août 2004 Statut Membre Dernière intervention 1 septembre 2014 472
30 août 2007 à 18:47
Salut,

sur mandriva:

[bob 2] ~ > rpm -qa | grep gcc
libgcc1-4.1.2-1mdv2007.1
gcc3.3-cpp-3.3.6-3mdk
gcc-c++-4.1.2-1mdv2007.1
gcc3.3-g77-3.3.6-3mdk
gcc-4.1.2-1mdv2007.1
gcc-cpp-4.1.2-1mdv2007.1
gcc3.3-3.3.6-3mdk
[18:46 0.88]
[bob 3] ~ >

voili voilà

:-))
0
Il faut que j'écrive rpm -qa | grep gcc c'est sa ?
Si c'est bien sa je n'ai que sa "libgcc1-4.1.2-1mdv2007.1
gcc-cpp-4.1.2-1mdv2007.1"
Sinon mercie de vos réponse et de votre patience.
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
31 août 2007 à 00:58
rpm -qa ca liste les paquets, et le grep ça les filtre. C'est juste pour te montrer que le paquet existe bien que bob à fait ca. Concrètement toi tu l'installes avec urpmi (urpmi gcc). Si ça ne marche pas c'est que ton urpmi est mal configuré, auquel cas cf :
http://easyurpmi.zarb.org/?language=fr

Bonne chance
0
bob031 Messages postés 8158 Date d'inscription samedi 7 août 2004 Statut Membre Dernière intervention 1 septembre 2014 472
31 août 2007 à 19:17
Salut,

Acawa : Mais quand je rentre "urpmi gcc" il m'écrit "pas de packtage gcc"

Mamiemando : je suis surprise que mandriva n'ait pas un paquet appelé gcc

Chez moi la commande urpmi gcc me donne :
Le paquetage gcc-4.1.2 est déjà installé !

comme suggéré par mamiemando, la première chose à regarder sont tes sources pour le téléchargement des paquetages mises à jour, etc ...
Pour se faire il faut donc vérifier la configuration de "urpmi" !
Pour la configuration aller sur le site easyurpmi (voir réponse de mamiemando ci-dessus).
Une fois que la configuration des sources est effectuée, il suffit alors de relancer la commande urpmi gcc et là la réponse devrait être positive.

:-))


0
Désolé pour le retard de ma réponse mais je n'avais plus ne peut plus aller sur internet pour quelque semaine (la je vous répons de chez un copain). Je vais essayer ce que vous me proposer dés ce soir.
0
Zempachi Messages postés 7472 Date d'inscription vendredi 14 octobre 2005 Statut Contributeur Dernière intervention 5 juin 2020 906
3 sept. 2007 à 16:06
Salut, pour installer un logiciel tu peux passer par l'interface graphique:
http://doc.mandrivalinux.com/MandrakeLinux/101/fr/Starter.html/software-management.html
0