Linux Quimper

[Résolu] Compilateur gcc - inclusion math.h

Après plusieurs tentatives de compilation avec gcc (sur des fichiers C différents), et malgré les « bonnes inclusions », par exemple :
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
la compilation échoue, comme si le compilateur ne trouvait pas ou plus math.h.
Je ne l’ai d’ailleurs pas trouvé dans /usr/include, ni ailleurs.

Ce (mé)fait depuis ma réinstallation fraîche de la distribution 18.04, après une tentative avec la 20.04 qui n’avait pas de fichier pour mon imprimante HP.
Le formatage a été complet, / et /home puis j’ai remis mes fichiers personnels.

Une piste pour résoudre ce problème idiot ?

Salut, il me semble que math.h fait des librairie typiquement windows

Bonjour Michel,

Peux-tu coller ici la commande gcc que tu utilises, et les erreurs de compilation ?
Est-ce que tu fais bien la liaison de la bibliothèque ?

gcc programme.c -lm

<math.h> est normalement une inclusion du langage C, lequel est indépendant d’un système exploitation, sauf bien sûr à lui fournir un compilateur spécifique et des bibliothèques de fonctions compilées pour celui-ci.

J’aurais mieux aimé une solution à mon problème…

Vincent,
$ gcc tutodev.c -o tutodev

$ gcc tutodev.c -o tutodev
/tmp/ccLUaJgj.o : Dans la fonction « sin_ » :
tutodev.c:(.text+0x69) : référence indéfinie vers « pow »
tutodev.c:(.text+0x9d) : référence indéfinie vers « pow »
collect2: error: ld returned 1 exit status
$

Même résultat dans un autre test : les fonctions mathématiques sont « inconnues »
Avec ta proposition :

$ gcc tutodev.c -lm
$

mais ne produit rien.

Tant qu’à faire, je fournis le fichier utilisé pour cette tentative :

///tutodev1.blogspot.com
///karara Mohamed

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

///fonction pout calcule fact de n!
int fact(int n)
{
    if(n==1)return 1;
      return n*fact(n-1);
}

///fonction pour calcule une valeur approchee de sin(x) d'ordre n
float sin_(float x,int n)
{
if(n==0)return 0;///fin de sin_
int s=pow(-1,n-1);
if(n==1)s=1;///si n==1
  return s*(pow(x,2*n-1)/fact(2*n-1))+sin_(x,n-1);
}

int main()
{
    int n;
    float x;
    system("title Programme qui calcule une valeur approchee de sin(x) d'ordre n");
    printf("\n\n\t\t\tDonne n : ");
    scanf("%d",&n);
    printf("\t\t\tDonne X : ");
    scanf("%f",&x);
    printf("\t\t\tsin(%.2f)=%.2f",x,sin_(x,n));
    system("pause>NULL");
    return 0;
}

Au moins un autre exemple :

$ gcc Exemple47.c -o ex
/tmp/cc29JiTy.o : Dans la fonction « main » :
Exemple47.c:(.text+0x3f) : référence indéfinie vers « sqrt »
Exemple47.c:(.text+0x57) : référence indéfinie vers « atan »
Exemple47.c:(.text+0x84) : référence indéfinie vers « log10 »
Exemple47.c:(.text+0xb8) : référence indéfinie vers « sin »
Exemple47.c:(.text+0xdf) : référence indéfinie vers « cos »
Exemple47.c:(.text+0xe4) : référence indéfinie vers « exp »
collect2: error: ld returned 1 exit status
$

Fichier source :
/* fichier entête à inclure pour utiliser les fonctions mathématiques */

#include <math.h>
#include <stdio.h>

void main(void)
{
    double x, y;
    double a=6.0, b=-1.5, module, argument ;
    module = sqrt( a*a+b*b ) ;
    argument = atan( b/a );
    for ( x=1.0 ; x < exp(5) ; x=x+1.0 )
    {
        printf( "Le log decimal de x=%lf est %lf", x, log10(x) );
        y = fabs(sin(x)) + exp(cos(x));
    }
}

Il faut effectivement utiliser l’option libm (-lm) si tu utilises math.h

La sortie gcc ne te renvoie rien si la compilation se passe bien (code de sortie = 0).
Tu dois voir apparaitre ton executable tutodev.out si tu n’as pas spécifié de fichier de sortie (-o programme.exe par exemple)

1 J'aime

Michel, je me suis permis d’éditer tes posts afin de mettre les commandes et le code en forme (il faut utiliser le bouton </> de l’éditeur pour signaler les lignes de code).

Comme le dit Fanch, si tu n’as pas d’erreur après avoir utilisé la commande gcc et effectué la liaison avec -lm c’est bien parce que ça a fonctionné :slight_smile:

Tu dois avoir un exécutable a.out dans le répertoire.

Vincent,
Merci pour la mise en forme, je ne savais pas faire. Il faudra que j’essaye les 4 espaces pour cette mise en forme, très nettement plus élégante et plus lisible.

Dans le premier essai réalisé, il n’y avait pas eu génération d’un « a.out » :
gcc programme.c -lm
mais si j’ajoute gcc programme.c -lm -o prog
ça fonctionne !
(NB : bien séparer -lm et -o, sinon ça ne compile pas).

Merci à tous, problème résolu.
Mais depuis quand faut-il utiliser ce commutateur « -lm » --en plus bien sûr de <math.h> ???

À tout hasard, j’ai compilé l’un de mes programmes ne faisant que des calculs simples, volontairement multi-fichiers (7 .c, un .h, le makefile) qui s’est compilé sans problème à l’appel de « make ».

NB : après vérification de quelques errements personnels en C, je n’ai pas trouvé de programme nécessitant <math.h>…

Depuis que l’on fait de la liaison dynamique, si je ne dis pas de bêtise :thinking:

Vérifie dans tes Makefile, le switch pour gcc doit y figurer.

Vincent,

J’ai vérifié « math.h » dans Wikipédia, chapitre « libm »
« Sous Linux et FreeBSD, les fonctions mathématiques (telles que déclarées dans math.h) sont regroupées séparément dans la bibliothèque mathématique libm. Donc si l’une de ces fonctions est utilisée, la directive -lm doit être ajoutée à l’éditeur de liens. »
(ici : math.h — Wikipédia)

Idem ici :
https://fr.wikibooks.org/wiki/Programmation_C/Mathématiques
et dans d’autres sites.

Merci à vous, je suis moins bête, mais j’aurais dû y penser tout seul aupravant, comme un grand…