8
votes

GCC donne une erreur lors de l'utilisation de FMOD ()

échantillon code pour fmod: xxx

compilation: xxx

i get

/tmp/ccztjo01.o: En fonction "Main":

Main.c :(. Texte + 0x4D): Référence non définie à `FMOD '

Collect2: LD renvoyé 1 statut de sortie

Puis j'ai trouvé ceci dans google: xxx

Pourquoi dois-je utiliser -LM , qu'est-ce que c'est exactement? D'où je peux obtenir plus d'informations sur GCC en détail?


0 commentaires

3 Réponses :


10
votes

-lm est simplement le dire à lier libm , qui contient toutes les routines mathématiques de point flottant, y compris (aucune surprise ici) fmod .


0 commentaires

4
votes

Ce n'est pas le compilateur, mais le linker , ld , qui se plaint. Il ne peut pas trouver la routine fmod dans votre programme. Vous devez le dire de créer un lien avec la bibliothèque de maths libm avec le drapeau -l .

[beaucoup] Plus d'infos: GCC, la collection GNU Compiler .


0 commentaires

3
votes

Lorsque j'entraîne gcc -lm main.c -o Main. / code> Je reçois toujours une erreur de liaison. Je dois écrire gcc Main.c -lm -o principal pour cela fonctionne correctement. Si cela fonctionne pour vous l'inverse, c'est un peu étrange. Je comprends que la liaison trouvera le symbole déclaré dans Main.c (c.-à-d. double fmod (double, double) ), mais ne le résolvez que s'il trouve sa définition ultérieurement (c.-à-d. Dans libm .a ).

Bref Story Short, les bibliothèques doivent être placées (au moins une fois) à droite de "l'endroit où ils sont utilisés.


2 commentaires

De retour en 2010, lorsque cette question a été posée, la plupart des distributions Linux ont configuré GCC de relier les bibliothèques partagées, qu'ils soient apparus avant ou après avoir été référencés dans la séquence de liaison. Et certains font encore.


Intéressant. J'ai ajouté une réponse parce que je pensais que cela peut être utile pour que quelqu'un d'autre regarde dans cette erreur.