Référence indéfinie à `sin`

J’ai le code suivant (réduit à l’essentiel pour cette question):

#include #include double f1(double x) { double res = sin(x); return 0; } /* The main function */ int main(void) { return 0; } 

Lors de la compilation avec gcc test.c j’obtiens l’erreur suivante et je ne peux pas comprendre pourquoi:

 /tmp/ccOF5bis.o: In function `f1': test2.c:(.text+0x13): undefined reference to `sin' collect2: ld returned 1 exit status 

Cependant, j’ai écrit divers programmes de test qui appellent sin de la fonction main , et ceux-ci fonctionnent parfaitement. Je dois faire quelque chose qui ne va évidemment pas bien, mais qu’est-ce que c’est?

    Vous avez compilé votre code avec des références au fichier d’en-tête math.h correct, mais lorsque vous avez tenté de le lier, vous avez oublié d’inclure la bibliothèque de mathématiques. Par conséquent, vous pouvez comstackr vos fichiers d’object .o, mais pas créer votre exécutable.

    Comme Paul l’a déjà mentionné, ajoutez ” -lm ” à la bibliothèque mathématique à l’étape où vous essayez de générer votre exécutable.

    Dans le commentaire , linuxD demande:

    Pourquoi pour sin() dans , avons-nous besoin de l’option -lm explicitement; mais pas pour printf() dans ?

    Parce que ces deux fonctions sont implémentées dans le cadre de la “spécification UNIX unique”. Cet historique de cette norme est intéressant et est connu sous plusieurs noms (IEEE Std 1003.1, Guide de portabilité X / Open, POSIX, Spec 1170).

    Cette norme sépare spécifiquement les routines “Standard C library” des routines “Standard C Mathematical Library” (page 277) . Le passage pertinent est copié ci-dessous:

    Bibliothèque standard C

    La bibliothèque standard C 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 que définies dans le volume 1, à l’exception des routines mathématiques.

    Bibliothèque mathématique standard C

    Cette bibliothèque prend en charge les routines mathématiques du système de base, telles que définies dans le volume 1. L’option cc -lm est utilisée pour rechercher cette bibliothèque.

    Le raisonnement derrière cette séparation a été influencé par un certain nombre de facteurs:

    1. Les guerres UNIX ont conduit à une divergence croissante par rapport à l’offre originale d’UN & T UNIX.
    2. Le nombre de plates-formes UNIX complique le développement de logiciels pour le système d’exploitation.
    3. Une tentative de définition du plus petit dénominateur commun pour les développeurs de logiciels a été lancée, appelée 1988 POSIX .
    4. Les développeurs de logiciels programmés par rapport au standard POSIX pour fournir leurs logiciels sur des “systèmes compatibles POSIX” afin d’atteindre plus de plates-formes.
    5. Les clients UNIX ont exigé des systèmes UNIX “compatibles POSIX” pour exécuter le logiciel.

    Les pressions qui ont alimenté la décision de mettre -lm dans une autre bibliothèque incluaient probablement, mais ne se limitaient pas à:

    1. Cela semble être un bon moyen de réduire la taille de la libc, car de nombreuses applications n’utilisent pas les fonctions intégrées dans la bibliothèque mathématique.
    2. Il offre une certaine flexibilité dans l’implémentation de la bibliothèque mathématique, où certaines bibliothèques mathématiques s’appuient sur des tables de recherche intégrées plus importantes, tandis que d’autres peuvent s’appuyer sur des tables de consultation plus petites (solutions informatiques).
    3. Pour les applications dont la taille est réellement limitée, cela permet de réimplémenter la bibliothèque mathématique de manière non standard (par exemple, retirer juste sin() et le placer dans une bibliothèque personnalisée.

    Dans tous les cas, il fait désormais partie du standard pour ne pas être automatiquement inclus dans le langage C, et c’est pourquoi vous devez append -lm .

    J’ai quand même le problème avec -lm ajouté

     gcc -Wall -lm mtest.c -o mtest.o mtest.c: In function 'f1': mtest.c:6:12: warning: unused variable 'res' [-Wunused-variable] /tmp/cc925Nmf.o: In function `f1': mtest.c:(.text+0x19): undefined reference to `sin' collect2: ld returned 1 exit status 

    J’ai découvert récemment que cela ne fonctionnait pas si vous spécifiez d’abord -lm. La commande compte:

     gcc mtest.c -o mtest.o -lm 

    Lien juste sans problèmes

    Donc, vous devez spécifier les bibliothèques après.

    Vous devez créer un lien avec la bibliothèque mathématique, libm:

     $ gcc -Wall foo.c -o foo -lm 

    J’ai eu le même problème, qui a disparu après la liste de ma bibliothèque dernière: gcc prog.c -lm