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
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
16 réponses
mamiemando
Messages postés
33410
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
2 décembre 2024
7 808
27 août 2007 à 00:20
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
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 :
Dans cet exemple on voit en particulier qu'il faut inclure stdio.h pour pouvoir utiliser printf :
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 :
3) A présent je peux exécuter mon programme :
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.
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 :
3) A présent je peux utiliser ma fonction mando_a_dit dans main.c, à condition d'inclure le header correspondant. main.c devient :
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.
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 ;
Ce qui donne :
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 !
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 !
bob031
Messages postés
8158
Date d'inscription
samedi 7 août 2004
Statut
Membre
Dernière intervention
1 septembre 2014
473
27 août 2007 à 11:28
27 août 2007 à 11:28
Bonjour,
Très chouette entrée en matière !
Merci beaucoup !
:-))
Très chouette entrée en matière !
Merci beaucoup !
:-))
mamiemando
Messages postés
33410
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
2 décembre 2024
7 808
27 août 2007 à 12:32
27 août 2007 à 12:32
Merci du compliment :)
J'espère que ça conviendra à Acawa également !
J'espère que ça conviendra à Acawa également !
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.
"bash: gcc: command not fond"
Je te souhaite bonne continuation car tes explications sont sinon très bonne.
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 569
27 août 2007 à 23:34
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.
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
mamiemando
Messages postés
33410
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
2 décembre 2024
7 808
28 août 2007 à 09:41
28 août 2007 à 09:41
Yep comme a dit lami20j, installe tout simplement gcc. En root (dans une console super utilisateur) :
Merci du compliment lami20j ;)
urpmi gcc
Merci du compliment lami20j ;)
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.
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.
mamiemando
Messages postés
33410
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
2 décembre 2024
7 808
29 août 2007 à 00:12
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
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
mamiemando
Messages postés
33410
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
2 décembre 2024
7 808
30 août 2007 à 00:28
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
Bonne chance
bob031
Messages postés
8158
Date d'inscription
samedi 7 août 2004
Statut
Membre
Dernière intervention
1 septembre 2014
473
30 août 2007 à 18:47
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à
:-))
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à
:-))
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.
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.
mamiemando
Messages postés
33410
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
2 décembre 2024
7 808
31 août 2007 à 00:58
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
http://easyurpmi.zarb.org/?language=fr
Bonne chance
bob031
Messages postés
8158
Date d'inscription
samedi 7 août 2004
Statut
Membre
Dernière intervention
1 septembre 2014
473
31 août 2007 à 19:17
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.
:-))
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.
:-))
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.
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
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
http://doc.mandrivalinux.com/MandrakeLinux/101/fr/Starter.html/software-management.html