UCL-INGI / LEPL1503-Blog

Blog du projet P3 à l'UCLouvain
MIT License
0 stars 10 forks source link

Quelques flags utiles pour la compilation #2

Closed mbardiau closed 4 years ago

mbardiau commented 4 years ago

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.

obonaventure commented 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

obonaventure commented 4 years ago

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.

mbardiau commented 4 years ago

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 dans le fichier, disons "fun.c". Lors de la compilation la commande à executer sera : gcc fun.c -o fun -lminmax -Lminmax -Wall -Werror

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.

obonaventure commented 4 years ago

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

mbardiau commented 4 years ago

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