Почему я должен явно ссылаться на libm?

Возможный дубликат:
Почему вы должны связать математическую библиотеку с C?

Когда я пишу программу, которая использует функции из библиотеки math.h, почему я должен явно ссылаться на libm, даже если они являются частью стандартной библиотеки C?

Например, когда я хочу использовать функцию sin(), мне нужно #include <math.h>, но мне также нужно передать -lm в GCC. Но для любой другой библиотеки из стандартной библиотеки мне не нужно это делать. Почему разница?

Ответ 1

В старые времена линкеры были медленными и отделяли в основном неиспользуемый математический код от остальных, что ускоряло процесс компиляции. Разница сегодня не так велика, поэтому вы можете добавить параметр -lm в конфигурацию вашего компилятора по умолчанию.


Обратите внимание, что заголовок <math.h> (или любой другой заголовок) не содержит кода. Он содержит информацию о коде, а именно как для вызова функций. Сам код находится в библиотеке. Я имею в виду, что ваша программа не использует библиотеку "<math.h>", она использует математическую библиотеку и использует прототипы, объявленные в заголовке <math.h>.

Ответ 2

По той же причине вы должны явно ссылаться на libpthread на большинстве реализаций. Когда в стандартную библиотеку добавляется что-то новое и страшное, оно обычно сначала реализуется как отдельная библиотека надстроек, которая переопределяет некоторые символы в старой стандартной библиотечной реализации с версиями, которые соответствуют новым требованиям, а также добавляет много новые интерфейсы. Я бы не удивился, если бы некоторые исторические реализации имели отдельные версии printf в libm для печати с плавающей запятой, а в основной libc с плавающей точкой - "легкая" версия. Этот вид реализации фактически упоминается и поощряется для крошечных систем в обоснованном документе ISO C, если я правильно помню.

Конечно, в долгосрочной перспективе разделение стандартной библиотеки, как это, приводит к гораздо большему количеству проблем, чем преимуществ. Наихудшей частью является, вероятно, увеличение времени загрузки и использования памяти для динамически связанных программ.

Ответ 3

Собственно, причиной, по которой вам обычно не нужно связываться с libm для большинства математических функций, является то, что они встроены в ваш компилятор. Ваша программа не сможет ссылаться на платформу, где это не так.