325 votes

Pourquoi avez-vous lier la bibliothèque mathématique en C ?

Si je comprend ou dans un programme C, je ne dois pas relier lors de la compilation, mais je dois faire un lien vers , en utilisant avec gcc, par exemple :

Quelle est la raison pour cela ? Pourquoi est-ce que je dois lier de manière explicite la bibliothèque mathématique mais pas les autres bibliothèques ?

303voto

ephemient Points 87003

Les fonctions en stdlib.h et stdio.h ont des implémentations en libc.so (ou .a la liaison statique), qui est lié à votre exécutable par défaut (comme si -lc a été spécifié). GCC peut être instruits pour éviter ce lien automatique avec l' -nostdlib ou -nodefaultlibs options.

Les fonctions mathématiques en math.h ont des implémentations en libm.so (ou .a pour la liaison statique), et libm n'est pas lié par défaut. Il y a des hystériques, des raisins secs des raisons historiques libm/libc split, rien de très convaincant.

Fait intéressant, le C++ runtime libstdc++ requres libm, donc si vous compilez un programme en C++ avec GCC (g++), vous obtiendrez automatiquement libm liée.

97voto

Nosredna Points 33670

Rappelez-vous que C est une vieille langue, et que les Unités de police constituées sont un phénomène relativement récent. J'ai d'abord vu C sur 8 bits des processeurs où il a été beaucoup de travail à faire encore entier de 32 bits de l'arithmétique. Beaucoup de ces implémentations ne même pas avoir un calcul en virgule flottante disponibles de la bibliothèque!

Même sur le premier 68000 machines (Mac, Atari ST, Amiga), la virgule flottante coprocesseurs étaient souvent cher add-ons.

De faire tout calcul en virgule flottante, vous avez besoin d'un assez importante bibliothèque. Et le calcul a été lente. Si vous aurez rarement utilisé flotteurs. Vous avez essayé de tout faire avec des nombres entiers ou entiers à l'échelle. Quand vous avez eu à inclure les mathématiques.h, vous serrant les dents. Souvent, vous devez écrire votre propre approximations et de tables de recherche pour l'éviter.

Compromis existé pendant une longue période. Parfois, il y avait en compétition de mathématiques paquets appelés "fastmath" ou telle. Quelle est la meilleure solution pour les mathématiques? Vraiment précis mais lent des trucs? Inexacts, mais vite? De grandes tables pour les fonctions trigonométriques? Il n'était pas jusqu'à ce que les coprocesseurs été garantie dans l'ordinateur que la plupart des implémentations est devenu évident. J'imagine qu'il y a un programmeur là, quelque part à droite maintenant, en travaillant sur une puce intégrée, en essayant de décider d'intégrer dans la bibliothèque de mathématiques à gérer certains problèmes mathématiques.

C'est pourquoi les mathématiques n'était pas standard. De nombreux ou peut-être la plupart des programmes n'ont pas utilisé un seul flotteur. Si les Unités de police constituées avait toujours été autour, et des flotteurs et des doubles étaient toujours cher à fonctionner sur, pas de doute, il y aurait eu un "stdmath".

28voto

Bastien Léonard Points 18404

Une explication est donnée ici:

Donc, si votre programme est à l'aide de fonctions mathématiques, et y compris, math.h, alors vous avez besoin pour établir un lien explicite entre la bibliothèque de mathématiques en passant par la -lm drapeau. La raison de cette séparation est que les mathématiciens sont très pointilleux sur la façon dont leur apprentissage des mathématiques est calculé et ils peuvent utiliser leur propre mise en œuvre des fonctions mathématiques au lieu de la norme de mise en œuvre. Si les fonctions mathématiques ont été regroupés dans libc.a il ne serait pas possible de le faire.

[Modifier]

Je ne suis pas sûr que je suis d'accord avec cela, cependant. Si vous avez une bibliothèque qui fournit, disons, sqrt(), et de passer devant la bibliothèque standard, un Unix éditeur de liens de prendre votre version, non?

3voto

Lou Franco Points 48823

Je pense que c'est une sorte de arbitraire. Vous devez tracer une ligne quelque part (dont les bibliothèques sont par défaut et qui ont besoin d'être précisées).

Il vous donne la possibilité de le remplacer par un autre qui a les mêmes fonctions, mais je ne pense pas, il est très courant de le faire.

EDIT: (à partir de mes propres commentaires): je pense que gcc ne ce afin d'assurer la rétrocompatibilité avec l'original cc. Ma conjecture pourquoi les cc ne c'est parce que du temps de construction -- cc a été écrit pour les machines avec beaucoup moins de puissance que nous avons maintenant. Beaucoup de programmes ont pas de mathématiques à virgule flottante et ils ont probablement pris toutes les bibliothèques qui n'est pas couramment utilisé en dehors de la valeur par défaut. Je suppose que le temps de génération de l'OS UNIX et les outils qui vont avec ont été la force motrice.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X