Pourquoi avez-vous besoin d’une option explicite du compilateur `-lm`

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

  1. Les bibliothèques standard sont garanties d’être disponibles. Lier explicitement d’autres bibliothèques posix telles que pthread a un sens, mais pourquoi devons-nous créer un lien explicite pour une bibliothèque standard? Même la raison historique n’est pas très claire.
  2. Pourquoi libm a-t-il été séparé de libc?
  3. Pourquoi héritons-nous encore de ces comportements dans les récents compilateurs gcc? Quelle simplicité il atteint? Voici ce que j’ai testé, sans libm et avec libm. Celui sans libm, j’ai écrit ma propre version de Pow

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.