FONCTION DE MATHS EN C - C - Programmation
Marsh Posté le 09-03-2005 à 21:02:58
Pas mieux que Taz... il fo mettre l'option -lm dans ta commande de compilation
Marsh Posté le 09-03-2005 à 21:16:18
la_marseillaise a écrit : a quoi set cette option? |
Avec gcc, à ajouter la bibliothèque mathématique
Citation : et d'ou viens une telle erreur? |
Le linker ne trouve pas la fonction. Normal, elle ne fat pas partie de la bibliothèque standard par défaut (pour éviter d'encombrer la mémoire sur les cibles de taille réduite, je suppose...)
http://mapage.noos.fr/emdel/notes.htm#bibliotheque
Marsh Posté le 09-03-2005 à 21:32:42
Emmanuel D elahaye
la bibliotheque figure bien dans mon repertoire include
Taz
j'ai deja regarder le man
Marsh Posté le 09-03-2005 à 21:38:51
la_marseillaise a écrit : ... |
C'est le bon que tu as regardé ?
SQRT(3) Manuel du programmeur Linux SQRT(3)
NOM
sqrt, sqrtf, sqrtl - Fonction racine carrée (square root).
SYNOPSIS
#include <math.h>
double sqrt (double x);
float sqrt (float x);
long double sqrt (long double x);
DESCRIPTION
La fonction sqrt() renvoie la racine carrée non‐négative de x. Elle échoue et positionne errno a EDOM, si x est négatif.
ERREURS
EDOM x est négatif.
NOTES
Pour utiliser les fonctions de la bibliothèque mathématique, il ne faut pas oublier dajouter largument ‐lm sur la ligne de commande de cc(1) ou ld(1), lors de lédition des liens.
CONFORME A
SVID 3, POSIX, BSD 4.3, ISO 9899. Les variantes float et long double sont des demandes C99.
VOIR AUSSI
hypot(3)
TRADUCTION
Christophe Blaess, 1996‐2003.
Marsh Posté le 09-03-2005 à 21:43:15
darkoli
l'erreur unreconized est aussi pour pow
ma racine est bien positive
Marsh Posté le 09-03-2005 à 21:51:09
POW(3) Manuel du programmeur Linux POW(3) |
Marsh Posté le 09-03-2005 à 21:57:35
la_marseillaise a écrit : -lm est obligatoire? |
Lorsque tu appelles une fonction de la librairie "/usr/lib/libqqchose.a", tu dois indiquer au compilo que tu utilises cette librairie afin que le compilo sache où se trouve le code de la fonction
gcc machin.c /usr/lib/libqqchose.a -o machin
Raccourci, l'option "-lqqchose" est un raccourci vers "/usr/lib/libqqchose.a" donc tu peux remplacer la commande précédente par
gcc machin.c -lqqchose -o machin
Ici, tu utilises la librairie "libm.a" donc "-lm"
la_marseillaise a écrit : ca me parait lourd |
Ce qui serait vraiment lourd, comme l'a dit Emmanuel, c'est que toutes les librairies existantes soient automatiquement reliées lors de la compilation. Là, tu aurais une compilationqui dure 3 plombes.
Ici, au contraire, c'est toi le maître. Tu utilises les librairie "/usr:lib/libx.a" et "/usr/lib/liby.a" donc tu l'indiques au compilo
cc machin.c -lx -ly -o machin
Marsh Posté le 09-03-2005 à 21:57:38
oui c'est tres lourd!
merci mais j'ai deja lu toute cette doc!!!!
Marsh Posté le 09-03-2005 à 21:59:09
Sve@r
je n'utilise pas de .a que des .h
je n'ai pas trop compris
(je debute en C)
Marsh Posté le 09-03-2005 à 22:03:15
la_marseillaise a écrit : Sve@r |
alors fais comme si t'avais compris, ça a peut d'importance pour le moment. retiens juste que pour certaines bibliothèques, il faut dire à gcc où elles sont.
Marsh Posté le 09-03-2005 à 22:03:56
la_marseillaise a écrit : Sve@r |
Pour résumer, le ".h" c'est le descriptif des fonctions que tu utilises.
Ex: sqrt prend comme argument un double et renvoie un double.
C'est en effet plus facile d'inclure un fichier ".h" regroupant un descriptif de 80 fonctions que de réécrire tous les descriptifs. Car tu es obligé de déclarer dans ton source toutes les fonctions que tu vas utiliser avant de les utiliser.
Le ".a", c'est un gros fichier contenant le code exécutable des fonctions. Calculer une racine carrée ne se fait pas en 3 opérations. Il faut une boucle, etc. Ce code est déjà précompilé et inclus dans le ".a"
Quand tu compiles, tu indiques au compilo où se trouve le code des fonctions que tu vas utiliser.
On pourrait inclure le code dans le ".h" mais n'importe qui pourrait toucher le code donc on aurait de gros pb.
Marsh Posté le 09-03-2005 à 22:05:47
Sve@r
je te remercie beaucoup
j'ai tres bien compris
MERCI A TOUS!!!!!
Marsh Posté le 09-03-2005 à 22:48:25
la_marseillaise a écrit : -lm est obligatoire? |
Oui.
Citation : ca me parait lourd |
Peut importe, c'est comme ça, (et c'est pas lourd)
Marsh Posté le 09-03-2005 à 22:55:28
la_marseillaise a écrit : |
J'avais pourtant posté un lien... Tu ne l'as pas lu, c'est dommage...
Rappel : Un .h est un fichier d'interface (la partie visible de la bibliothèque). Il ne contient pas le code d'ecécution. Celui-ci se trouve dans un .a (.lib etc. selon le système). Par défaut une partie de la bibliothèque standard est liée automatiquement. Si on a besoin d'autres fonctions standard (comme les fonctions qui utilisent les flottants), on signale au linker qu'il faut ajouter ce qui manque (-lm) c'est une façon simple et rapide de le demander.
La méthode officielle (qu'il faut utiliser pour les bibliothèques non standards) est plutôt du genre
-llibxxx.a |
Nota : ces détails (importants) sont liés à l'implémentation du langage (compilateur, environnement de développement, système) et non au langage C lui-même.
Tout est expliqué dans le manuel de ton compilateur...
Marsh Posté le 10-03-2005 à 08:08:50
Emmanuel Delahaye a écrit : La méthode officielle (qu'il faut utiliser pour les bibliothèques non standards) est plutôt du genre
|
C'est pas plutôt "libxxx.a" sans le "-l" ?
Marsh Posté le 09-03-2005 à 20:56:36
Bonjour
J'ai un petit probleme en C.
Je veux utiliser les fonctions de la bibliotheque
math.h.
Je fait "#include <math.h>"
et j'ai bien verifier dans /usr/bin/include
que math.h existe bien.
J'ai une erreur unreconized sqrt.
Pourquoi????