Vous avez compilé votre code avec des références au bon fichier d'en-tête math.h, mais lorsque vous avez tenté de le lier, vous avez oublié l'option permettant d'inclure la bibliothèque mathématique. En conséquence, vous pouvez compiler vos fichiers objets .o, mais pas construire votre exécutable.
Comme Paul l'a déjà mentionné, ajoutez " -lm
"pour établir un lien avec la bibliothèque mathématique dans l'étape où vous tentez de générer votre exécutable.
Dans le commentaire , linuxD demande :
Pourquoi pour sin()
sur <math.h>
avons-nous besoin -lm
l'option explicitement ; mais pas pour printf()
sur <stdio.h>
?
Car ces deux fonctions sont implémentées dans le cadre de la "spécification UNIX unique". L'histoire de cette norme est intéressante, et est connue sous de nombreux noms (IEEE Std 1003.1, X/Open Portability Guide, POSIX, Spec 1170).
Cette norme, sépare spécifiquement les routines de la "bibliothèque C standard" des routines de la "bibliothèque mathématique C standard" (page 277) . Le passage pertinent est copié ci-dessous :
Bibliothèque C standard
La bibliothèque C standard est automatiquement recherchée par cc
pour résoudre les références externes. Cette bibliothèque prend en charge toutes les interfaces du système de base, telles qu'elles sont définies dans le Volume 1, à l'exception des routines mathématiques.
Bibliothèque mathématique standard en C
Cette bibliothèque prend en charge les routines mathématiques du système de base, telles que définies dans le volume 1. Le site cc
option -lm
est utilisé pour effectuer des recherches dans cette bibliothèque.
Le raisonnement derrière cette séparation a été influencé par un certain nombre de facteurs :
- En Les guerres d'UNIX a conduit à une divergence croissante par rapport à l'offre originale d'AT&T UNIX.
- Le nombre de plates-formes UNIX a rendu plus difficile le développement de logiciels pour le système d'exploitation.
- Une tentative de définir le plus petit dénominateur commun des développeurs de logiciels a été lancée, appelé 1988 POSIX .
- Les développeurs de logiciels programmés contre la norme POSIX doivent fournir leurs logiciels sur des "systèmes conformes à la norme POSIX" afin d'atteindre davantage de plates-formes.
- Les clients UNIX ont exigé des systèmes UNIX "conformes à POSIX" pour exécuter le logiciel.
Les pressions qui ont alimenté la décision de mettre -lm
dans une autre bibliothèque probablement inclus, mais ne sont pas limités à :
- Cela semble être un bon moyen de limiter la taille de la libc, car de nombreuses applications n'utilisent pas les fonctions intégrées dans la bibliothèque mathématique.
- Il offre une certaine souplesse dans la mise en œuvre des bibliothèques mathématiques, certaines bibliothèques mathématiques reposant sur des tables de consultation intégrées plus importantes, tandis que d'autres peuvent s'appuyer sur des tables de consultation plus petites (solutions de calcul).
- Pour les applications dont la taille est vraiment limitée, il est possible de réimplémenter la bibliothèque mathématique de manière non standard (par exemple, en retirant seulement les éléments suivants
sin()
et le mettre dans une bibliothèque personnalisée.
Quoi qu'il en soit, il fait maintenant partie de la norme pour ne pas être automatiquement inclus dans le langage C, et c'est pourquoi vous devez ajouter -lm
.
1 votes
Je pense il pourrait s'agir d'un doublon
0 votes
@peoro, ça ne me surprendrait pas. C'est une bibliothèque "oubliée" très courante.