Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 03/03/2024, à 10:59

vercoucas

[RESOLU]Langage C fonction de math

Bonjour à tous

Je ne parviens pas à utiliser les fonctions de la bibliothèque math.
le tout fonctionne correctement si l'argument de la fonction mathématique est un nombre mais la compilation ne se fait pas
quand l'argument est une variable (de type double comme il est requis pour ces fonctions).


#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void main()
{

    y =sqrt(100.00);
    printf("\nracine de 100.00 = %f\n", y);
}
sylvieb@HP8300:~/Documents/c_program$ gcc -lm xtest.c
sylvieb@HP8300:~/Documents/c_program$ ./a.out 

racine de 100.00 = 10.000000
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
void main()
{
    double x = 100.00;
    double y;

    y =sqrt(x);
    printf("\nracine de %f = %f\n", x , y);
}
$ gcc -lm xtest.c
/usr/bin/ld : /tmp/cc07tQ2R.o : dans la fonction « main » :
xtest.c:(.text+0x23) : référence indéfinie vers « sqrt »
collect2: error: ld returned 1 exit status

J'ai cherché sans succès d'où viens le blocage. La bibliothèque math est incluse,
la variable est de type double, la compilation est effectuée avec gcc -lm
et le programme fonctionne avec un argument numérique.

Merci de votre aide

Dernière modification par vercoucas (Le 03/03/2024, à 11:46)

Hors ligne

#2 Le 03/03/2024, à 11:22

kamaris

Re : [RESOLU]Langage C fonction de math

Essaie

gcc xtest.c -lm
man gcc a écrit :

It  makes  a  difference where in the command you write this option; the linker searches and processes libraries and object files in the order they are specified.  Thus, foo.o -lz bar.o searches library z after file foo.o but before bar.o.  If bar.o refers to functions in z, those functions may not be loaded.

Hors ligne

#3 Le 03/03/2024, à 11:27

lann

Re : [RESOLU]Langage C fonction de math

Chez moi, cette commande de compilation fonctionne

gcc -o xtest xtest.c -lm

Hors ligne

#4 Le 03/03/2024, à 11:29

Nuliel

Re : [RESOLU]Langage C fonction de math

Bonjour,
Ton premier code ne compile pas, tu n'as pas déclaré le type de y.

La raison est très particulière: -lm doit arriver à la fin de la commande pour que cela fonctionne.

En fait le premier binaire généré n'appelle pas sqrt, gcc a calculé la valeur à l'avance car elle est fixe. Donc ça compile même sans -lm.
Pour preuve, on ne voit pas dans le code désassemblé d'appel à sqrt:

0000000000001149 <main>:
    1149:       f3 0f 1e fa             endbr64 
    114d:       55                      push   %rbp
    114e:       48 89 e5                mov    %rsp,%rbp
    1151:       48 83 ec 10             sub    $0x10,%rsp
    1155:       f2 0f 10 05 c3 0e 00    movsd  0xec3(%rip),%xmm0        # 2020 <_IO_stdin_used+0x20>
    115c:       00 
    115d:       f2 0f 11 45 f8          movsd  %xmm0,-0x8(%rbp)
    1162:       48 8b 45 f8             mov    -0x8(%rbp),%rax
    1166:       66 48 0f 6e c0          movq   %rax,%xmm0
    116b:       48 8d 05 96 0e 00 00    lea    0xe96(%rip),%rax        # 2008 <_IO_stdin_used+0x8>
    1172:       48 89 c7                mov    %rax,%rdi
    1175:       b8 01 00 00 00          mov    $0x1,%eax
    117a:       e8 d1 fe ff ff          call   1050 <printf@plt>
    117f:       90                      nop
    1180:       c9                      leave  
    1181:       c3                      ret

Dans le cas du deuxième programme, on voit bien l'appel à sqrt:

0000000000001169 <main>:
    1169:       f3 0f 1e fa             endbr64 
    116d:       55                      push   %rbp
    116e:       48 89 e5                mov    %rsp,%rbp
    1171:       48 83 ec 10             sub    $0x10,%rsp
    1175:       f2 0f 10 05 a3 0e 00    movsd  0xea3(%rip),%xmm0        # 2020 <_IO_stdin_used+0x20>
    117c:       00 
    117d:       f2 0f 11 45 f0          movsd  %xmm0,-0x10(%rbp)
    1182:       48 8b 45 f0             mov    -0x10(%rbp),%rax
    1186:       66 48 0f 6e c0          movq   %rax,%xmm0
    118b:       e8 e0 fe ff ff          call   1070 <sqrt@plt> <----------------------------------------appel ici
    1190:       66 48 0f 7e c0          movq   %xmm0,%rax
    1195:       48 89 45 f8             mov    %rax,-0x8(%rbp)
    1199:       f2 0f 10 45 f8          movsd  -0x8(%rbp),%xmm0
    119e:       48 8b 45 f0             mov    -0x10(%rbp),%rax
    11a2:       66 0f 28 c8             movapd %xmm0,%xmm1
    11a6:       66 48 0f 6e c0          movq   %rax,%xmm0
    11ab:       48 8d 05 56 0e 00 00    lea    0xe56(%rip),%rax        # 2008 <_IO_stdin_used+0x8>
    11b2:       48 89 c7                mov    %rax,%rdi
    11b5:       b8 02 00 00 00          mov    $0x2,%eax
    11ba:       e8 a1 fe ff ff          call   1060 <printf@plt>
    11bf:       90                      nop
    11c0:       c9                      leave  
    11c1:       c3                      ret

Au passage il n'y a pas besoin que tu comprennes le code désassemblé, c'est juste pour montrer la différence entre tes deux codes et que -lm n'est pas obligatoire sur le premier

Edit: doublement grilled tongue

Dernière modification par Nuliel (Le 03/03/2024, à 11:32)

Hors ligne

#5 Le 03/03/2024, à 11:45

vercoucas

Re : [RESOLU]Langage C fonction de math

Merci kamaris, iann, et Nuliel

Effectivement la compilation se fait correctement  en plaçant l'option -lm après le fichier.
C'est clair maintenant, je vois d'où venait mon erreur.

Merci encore pour votre aide

Dernière modification par vercoucas (Le 03/03/2024, à 11:48)

Hors ligne