Dupliquer possible:
gcc: pourquoi le drapeau -lm est nécessaire pour lier la bibliothèque mathématique?
De manière générale, pour utiliser n’importe quelle fonction mathématique en dehors du fichier d’en-tête math.h
vous devez vous lier à l’option de l’éditeur de liens -lm. -l
ici signifierait l’option de l’éditeur de liens pour rechercher la bibliothèque spécifique libm.o
Ma question est
Pourquoi GCC n’inclut pas cette bibliothèque par défaut? Est-ce parce que la bibliothèque utilise énormément math-coprocessor et qu’elle nécessite l’ajout d’un bit de code supplémentaire pour initialiser l’initialisation en virgule flottante (je peux utiliser une terminologie erronée ici)?
Remarque
Je viens de passer en revue toutes les réponses mentionnées dans le lien http://stackoverflow.com . Cela n’a pas beaucoup de sens pour moi. Il y a trois raisons fondamentales atsortingbuées
Voici l’exemple
abhibhat@abhibhat-VirtualBox:~/Projects/GIPL6_2$ ls -1 Test_*|xargs -I{} sh -c "echo {} && echo "-----------------" && cat {}" Test_withlibm.c ----------------- #include #include int main() { int i=20; double output1=pow(2.618033988749895,i); return 0; } Test_withoutlibm.c ----------------- #include #include double Pow(double _X, int _Y) { double _Z = 1; for (; _Y; _X *= _X) { if (_Y & 1) _Z *= _X; _Y >>= 1; } return _Z; } int main() { int i=20; double output1=Pow(2.618033988749895,i); return 0; } abhibhat@abhibhat-VirtualBox:~/Projects/GIPL6_2$ gcc Test_withlibm.c -lm -o Main_withlibm.o abhibhat@abhibhat-VirtualBox:~/Projects/GIPL6_2$ gcc Test_withoutlibm.c -o Main_withoutlibm.o abhibhat@abhibhat-VirtualBox:~/Projects/GIPL6_2$ objdump -d Main_withoutlibm.o|wc -l 261 abhibhat@abhibhat-VirtualBox:~/Projects/GIPL6_2$ objdump -d Main_withlibm.o|wc -l 241
Il est adapté aux systèmes (principalement intégrés) où les calculs en virgule flottante ne sont ni possibles ni nécessaires. C’est un peu historique, mais n’oubliez pas que gcc
et la plupart des autres compilateurs C ont été écrits à une époque où un 386SX était considéré comme un processeur hautes performances.
Par exemple, lorsque je travaillais encore dans l’informatique embarquée, nous utilisions des compilateurs standard (Microsoft et Borland) pour générer du code pour nos processeurs (Z80, 80186 et 68030). Si les compilateurs étaient liés par défaut à la bibliothèque mathématique, nous aurions eu des problèmes, aucun de nos systèmes n’ayant de capacités en virgule flottante ni n’en ayant besoin.
C’est vrai que 30 ans après, cela semble idiot, mais la raison en était bonne à cette époque.
Vous voudrez peut-être de nombreuses bibliothèques, et libm
n’est que l’une d’elles.
Pour chacun de ceux-ci, vous pouvez demander pourquoi il n’est pas inclus par défaut.
Peut-être que libm
est plus utile que d’autres, mais C préfère restr simple: vous voulez une bibliothèque, utilisez -l
pour l’utiliser.
Raisons historiques
Les raisons pour lesquelles libc
et libm
sont séparées et vous devez spécifier -lm
sur la ligne de commande sont des raisons historiques car libm
a également été utilisé par le compilateur Fortran.