Fonction sqrt non reconnue... [resolu] - C - Programmation
Marsh Posté le 30-03-2006 à 10:48:09
Il faut ajouter la bibliothèque mathématique au moment de l'édition de lien.
C'est-à-dire qu'il faut lier le fichier libm.so à ton programme pour que sqrt() soit une fonction reconnue.
Ca se fait avec l'option de compilation suivante : -lm
(-l = lier une bibliothèque, et "m" pour "libm" )
Marsh Posté le 30-03-2006 à 10:51:57
Merci beaucoup
mais quel ane je fais, en plus je le savais mais l'avais oublié,
THX!!!
Marsh Posté le 01-04-2006 à 19:31:56
Elmoricq a écrit : "m" pour "libm" |
"m" pour "/usr/lib/libm.a"
Marsh Posté le 01-04-2006 à 19:50:21
Sve@r a écrit : "m" pour "/usr/lib/libm.a" |
Mmm...
"m" pour "libm.a"
"/usr/lib/" est géré par -L
Marsh Posté le 01-04-2006 à 22:42:08
ReplyMarsh Posté le 01-04-2006 à 22:49:29
Taz a écrit : .a ? |
a comme 'archive'. C'est l'extension par défaut d'une bibliothèque générée par ar, l'archiveur (générateur de bibliothèque) de GCC.
Marsh Posté le 02-04-2006 à 09:23:03
nan mais c'est bon, je suis pas idiot, seulement en 2006, à part si on compile en statique, on s'en sert plus des .a ... (ou alors pour des libs foireuses aux API/ABI trop instables)
edit: et puis http://people.redhat.com/~drepper/ [...] nking.html
Marsh Posté le 02-04-2006 à 11:17:45
nargy a écrit : ou libm.so |
Ca, c'est autre chose. en général, la libXXX.a n'est une couche intermédiaire qui gère l'accès à la biblibliothèque partagée libXXX.so (gère le dlopen(), les pointeurs de fonctions etc.)
Il y a deux façon de procéder :
- la bibliothèque XXX statique :
tout le code est dans le libXXX.a et il doit être lié à l'application de façon statique (évidemment, c'est gros et redondant, d'un autre coté, c'est autonome...)
- la bibliothèque XXX dynamique :
le code est dans libXXX.so qui est unique
la couche d'interface (dlopen(), pointeurs de fonctions) se trouve dans un petit libXXX.a généré automatiquement quand on génère le .so, et qui doit être lié à l'application.
Marsh Posté le 02-04-2006 à 11:24:34
Taz a écrit : nan mais c'est bon, je suis pas idiot, seulement en 2006, à part si on compile en statique, on s'en sert plus des .a ... (ou alors pour des libs foireuses aux API/ABI trop instables) |
Ok, mais dire "on ne se sert plus de .a", est une anerie, si je puis me permettre.
Etant donné que les avantages apportés par les bibliothèques partagés sont indéniables, il est recommandé d'utiliser ce mécanisme. OK.
Mais les .a existent toujours et sont réduits à leur plus simple expression, tout simplement parce qu'un gros fénéant de codeur comme toi et moi n'a pas envie de se coltiner des dlopen() et des gestion d'interface à coup de pointeurs de fonctions, alors que ce code est généré automatiquement et placé dans le .a quand on crée une bibliothèque partagée .so ...
Je vois déjà le codeur lambda en train d'effacer tous les .a qui trainent sur son disque... et ça fout la trouille !
Marsh Posté le 02-04-2006 à 12:03:04
le ``.a`` c`est la roue de secours, un peu cn de la brûler...
Marsh Posté le 02-04-2006 à 12:28:34
Emmanuel Delahaye a écrit : Ca, c'est autre chose. en général, la libXXX.a n'est une couche intermédiaire qui gère l'accès à la biblibliothèque partagée libXXX.so (gère le dlopen(), les pointeurs de fonctions etc.) |
Pour quel OS ? Quand je crée un DSO sous Linux, ça ne génère pas de .a. "La couche d'interface" est dans l'exécutable.
Marsh Posté le 02-04-2006 à 12:31:20
Emmanuel Delahaye a écrit : Ok, mais dire "on ne se sert plus de .a", est une anerie, si je puis me permettre. |
Personellement, j'ai tendance à ne pas prendre Drepper pour un âne quand il parle bibliothèque. Même si son avis tranché me surprends un peu ...
Marsh Posté le 06-04-2006 à 09:52:02
La raison pour laquelle je n'ai pas précisé l'extension du fichier, c'est que pour moi ce n'est pas l'option "-l" qui définit l'extension, mais le fait de lier statiquement ou dynamiquement. Du coup, pour moi le "-lm" signifie juste "lier le fichier libm", le chemin étant précisé par -L (ou $LD_LIBRARY_PATH), et l'extension par la méthode de liage.
Pour le reste, je préfère lier dynamiquement, pour la simple raison que je ne vois pas de justification à dupliquer le code sur tous les fichiers.
Néanmoins, je trouve que lier statiquement a des avantages. Le premier que je vois, c'est bêtement lors de l'utilisation d'une version "exotique" d'une bibliothèque, qui présente des incompatibilités avec ce qui est normalement installé/présent. Lier statiquement, dans ce cas, évite de se prendre le chou à configurer le serveur où sera installé l'usine à gaz (parce qu'on est d'accord, si ça arrive, c'est qu'on est en présence d'Une Mauvaise Chose©)
Marsh Posté le 22-04-2006 à 17:07:08
Emmanuel Delahaye a écrit : Ok, mais dire "on ne se sert plus de .a", est une anerie, si je puis me permettre. |
BIEN dit
Marsh Posté le 30-03-2006 à 10:43:05
Bonjour,
j'ai un petit souci avec cette fonction.
Sur une exemple tout bete :
Et l'erreur retourné est :
[mathieu@Albatros ~]$ make essai
cc essai.c -o essai
/tmp/ccCCBP3p.o(.text+0x67): In function `solution':
essai.c: undefined reference to `sqrt'
collect2: ld a retourné 1 code d'état d'exécution
make: *** [essai] Erreur 1
Pourtant j'ai bien utilise la libraire math qui doit normalement contenir la fonction sqrt.
Renseignement :
compilateur : gcc 4.0.
linux : FC4 et mdv2006.
IDE : Kdevelop
Merci de votre aide
Message édité par le fou le 30-03-2006 à 10:52:18
---------------
Celui qui sauve une vie, sauve l'humanité (Le Talmud) - Personne n'a plus grand amour que celui de donner sa vie pour ses amis (Jean XV, 13)