62 votes

gcc: pourquoi le drapeau -lm est nécessaire pour lier la bibliothèque mathématique?

Je viens de découvrir que l' -lm drapeau est nécessaire par la gcc pour compiler un programme qui désigne une fonction de la bibliothèque de mathématiques. Je me demandais pourquoi un lien explicite entre le drapeau n'est pas nécessaire lors de la compilation de programmes contenant d'autres bibliothèques comme la bibliothèque. Si j'écris un programme où l' time() fonction est appelée, il compile sans problèmes, même avec pas de lien options. Mais un programme avec la bibliothèque de mathématiques impliquées ne va pas fonctionner sans l' -lm drapeau.

Quelqu'un peut-il expliquer la raison derrière ce comportement? Merci pour votre temps.

72voto

R.. Points 93718

Parce que le ridicule pratique historique que personne n'est prêt à les réparer. La consolidation de toutes les fonctions requises par C et POSIX dans un seul fichier de bibliothèque ne serait pas seulement d'éviter cette question se pose, mais aussi d'économiser une quantité importante de temps et de la mémoire lors de la liaison dynamique, puisque chaque .so le fichier lié nécessite les opérations de système de fichiers pour localiser et de le trouver, et quelques pages de ses variables statiques, les délocalisations, etc.

Une mise en œuvre où toutes les fonctions sont dans une bibliothèque et de l' -lm, -lpthread, -lrt, etc. les options sont toutes non-ops (ou un lien pour vider .a fichiers) est parfaitement conforme POSIX et certainement préférable.

Note: je parle POSIX parce que C lui-même ne précise rien sur la façon dont le compilateur est invoquée. Ainsi, vous pouvez simplement traiter "gcc -std=c99 -" lm " que la mise en œuvre spécifique de la manière dont le compilateur doit être appelé pour un comportement conforme.

33voto

ismail Points 19146

Parce que time() et d'autres fonctions sont builtin défini dans la bibliothèque C ( libc ) lui - même et GCC liens toujours à libc sauf si vous utilisez le -ffreestanding option de compilation. Cependant, les fonctions mathématiques vivent dans libm qui n'est pas implicitement lié par gcc.

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