Pages : 1
#1 Le 03/03/2024, à 09: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, à 10:46)
Hors ligne
#2 Le 03/03/2024, à 10:22
- kamaris
Re : [RESOLU]Langage C fonction de math
Essaie
gcc xtest.c -lm
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, à 10:27
- lann
Re : [RESOLU]Langage C fonction de math
Chez moi, cette commande de compilation fonctionne
gcc -o xtest xtest.c -lm
<Modéré>
Hors ligne
#4 Le 03/03/2024, à 10: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
Dernière modification par Nuliel (Le 03/03/2024, à 10:32)
Hors ligne
#5 Le 03/03/2024, à 10: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, à 10:48)
Hors ligne