Closed mbardiau closed 4 years ago
Bonjour,
Bonne idée. L'utilisation complète de gcc pourra faire l'objet de plusieurs posts sur le blog à mon avis. Sur base de ce que vous avez déjà écrit, je vous encourage à aller un peu plus loin dans l'explication de l'utilisation des librairies. Il y a différents éléments à prendre en compte:
Enfin, je vous encourage à toujours utiliser -WAll et -Werror dans vos exemples
Bonjour, Autre suggestion, montrer comment charger la librairie GMP qui est utilisée dans le projet cette année. Cela intéressera les autres étudiants.
Pour compiler un fichier c, il suffit d'utiliser la commande gcc fichier.c Il existe plusieurs flags utiles à connaitre :
1) -o fichier Ce flag permet de nommer l'exectuable "fichier"
2) -Wall Ce flag affiche tous les warnings. En effet, certains warning comme le fait de définir une variable sans l'utiliser, n'apparaissent pas sans ce flag.
3) -Werror Ce flag transforme tous les warnings en erreurs. Cela peut paraitre embettant mais il n'est jamais bon de laisser des warnings dans un code. Il est toujours bénéfique de directement traiter ces warnings et -Werror vous empêchera de compiler le programme comme il considèrera ces warnings comme erreurs. A noter que l'utilisation combinée de -Wall et -Werror est une bonne pratique à adapter pour limiter au maximum les erreurs dans votre code.
Une autre chose à savoir est que la librairie standard (c) est chargée automatiquement sans que l'on doive le spécifier. En revanche d'autres librairies nécessitent des flags particulier lors de la compilation. De manière générale, ces flags commencent par -l (library)
1) -lm
Ce flag est nécessaire pour utiliser les fonctions de la librairies math qui sont définies dans
2) -lpthread
Ce flag est nécessaire pour utiliser les fonctions de la librairies math qui sont définies dans
3) -lcunit Ce flag est nécessaire pour utiliser les fonctions de CUnit pour vos tests.
Si vous rencontrer des problèmes pour trouver une librairie (Vous avez installé CUnit manuellement par exemple), et que vous rencontrez l'erreur "cannot find -lcunit" vous devez rajouter le chemin vers la libraire avec le flag -L Exemple si la librairie se trouve dans un fichier "test" : gcc fichier.c fichier -lcunit -Ltest -Wall -Werror
On peut alors créer soi-même une librairie et vouloir l'inclure dans d'autres fichiers. Imaginons que l'on crée la libraire "minmax" qui contient des fonctions permettant de calculer le minimum et le maximum entre deux nombres et qui se situe dans le dossier minmax. Pour pouvoir utiliser ces fonctions il faut d'abord utiliser #include
Un exemple d'utilisation de la commande gcc qui utilise ces flags serait : gcc fichier.c fichier -lcunit -lm -lpthread -Wall -Werror
Enfin, n'oubliez pas que la manpage contient beaucoup d'informations utiles : http://man7.org/linux/man-pages/man1/gcc.1.html
Voici une modification qui reprend plusieurs éléments que vous avez proposé. Concernant la librarie GMP je n'ai pas encore eu l'occasion d'y toucher, j'ai prévu de regarder à ça cette semaine et je préfère attendre de la maitriser.
Merci, l'article avance bien. J'ai encore deux suggestions:
Pour GMP, je propose de ne pas en parler dans cet article qui est déjà assez long et de laisser un autre étudiant proposer un article à ce sujet
Pour compiler un fichier c, il suffit d'utiliser la commande gcc fichier.c Il existe plusieurs flags utiles à connaitre :
1) -o fichier Ce flag permet de nommer l'exectuable "fichier"
2) -Wall Ce flag affiche tous les warnings. En effet, certains warning comme le fait de définir une variable sans l'utiliser, n'apparaissent pas sans ce flag.
3) -Werror Ce flag transforme tous les warnings en erreurs. Cela peut paraitre embettant mais il n'est jamais bon de laisser des warnings dans un code. Il est toujours bénéfique de directement traiter ces warnings et -Werror vous empêchera de compiler le programme comme il considèrera ces warnings comme erreurs. A noter que l'utilisation combinée de -Wall et -Werror est une bonne pratique à adapter pour limiter au maximum les erreurs dans votre code.
Une autre chose à savoir est que la librairie standard (c) est chargée automatiquement sans que l'on doive le spécifier. En revanche d'autres librairies nécessitent des flags particulier lors de la compilation. De manière générale, ces flags commencent par -l (library)
1) -lm
Ce flag est nécessaire pour utiliser les fonctions de la librairies math qui sont définies dans
2) -lpthread
Ce flag est nécessaire pour utiliser les fonctions de la librairies math qui sont définies dans
3) -lcunit Ce flag est nécessaire pour utiliser les fonctions de CUnit pour vos tests.
Un exemple d'utilisation de la commande gcc qui utilise ces flags serait : gcc fichier.c fichier -lcunit -lm -lpthread -Wall -Werror
Si vous rencontrez des problèmes pour trouver une librairie (Vous avez installé CUnit manuellement par exemple), et que vous rencontrez l'erreur "cannot find -lcunit" vous devez rajouter le chemin vers la libraire avec le flag -L Exemple si la librairie se trouve dans /home/user/local/CUnit/ : gcc fichier.c fichier -lcunit -L/home/user/local/CUnit/ -Wall -Werror
On peut alors créer soi-même une librairie et vouloir l'inclure dans d'autres fichiers. Imaginons que l'on crée la libraire "minmax" qui contient des fonctions permettant de calculer le minimum et le maximum entre deux nombres et que l'on veuille l'utiliser dans un fichier "fun.c"
Contenu de minmax.h
#include <stdio.h>
int min(int a, int b);
int max(int a, int b);
Contenu de minmax.c
#include "minmax.h"
int min(int a, int b) {
if (a < b) {
return a;
}
return b;
}
int max(int a, int b) {
if (a > b) {
return a;
}
return b;
}
Contenu de fun.c
#include "minmax.h"
int main() {
printf("%d \n", min(1,3));
printf("%d \n", max(1,3));
return 0;
}
On effectue les commandes suivantes (le flag -c crée un objet .o) :
gcc -c minmax.c gcc -c fun.c gcc -o fun fun.o minmax.o
Et lorsque l'on lance le programme fun en faisant ./fun
1
3
Enfin, n'oubliez pas que la manpage contient beaucoup d'informations utiles : http://man7.org/linux/man-pages/man1/gcc.1.html
P.S : Je n'ai jamais crée de librarie auparavant, j'ai testé ce que j'ai écrit plus haut en local aujourd'hui
Pour compiler un fichier c, il suffit d'utiliser la commande : gcc fichier.c -o fichier (avec -o fichier pour que le nom de l'executable soit "fichier") Néanmoins dans certains cas on peut rencontrer des problèmes à la compilation en utilisant certains include. Si vous désirez utiliser #include, la librairie de maths, vous devrez rajouter un "-lm" comme flag dans la commande gcc : gcc fichier.c -o fichier -lm
Idem si vous souhaitez utiliser #include , il fait rajouter un flag -lpthread.
Enfin si vous voulez utilisez les tests CUnit, vous devrez également ajouter un flag -lcunit.
Sans ces flags, le terminal vous donnera une erreur vous disant que les commandes utilisées par ces librairies ne sont pas reconnues.