Для каких функций предназначена libm?

Насколько я знаю, некоторые математические функции содержатся в libc, а другие — в libm. Я обнаружил это экспериментально:

$ nm --dynamic --defined-only /lib/x86_64-linux-gnu/libm.so.6 | grep -w abs 
$ nm --dynamic --defined-only /lib/x86_64-linux-gnu/libc.so.6 | grep -w abs 
T abs

Есть ли требование относительно того, какие математические функции должны быть предоставлены libm? Предоставляют ли вместе libc и libm все математические функции, требуемые стандартом C?


person Alexey    schedule 05.01.2019    source источник
comment
libm содержит определения того, что объявлено в math.h.   -  person Etienne de Martel    schedule 05.01.2019
comment
Предоставляют ли вместе libc и libm все математические функции, требуемые стандартом C++? Нет, только то, что требуется для C. Если вам нужно узнать о какой-то конкретной функции, я рекомендую поискать в этом прекрасном справочнике. сайт.   -  person Some programmer dude    schedule 05.01.2019
comment
@EtiennedeMartel math.h содержит функцию abs, а libm — нет.   -  person Alexey    schedule 05.01.2019
comment
Нет, очевидно, что libc и libm не предоставляют все математические библиотеки C++. Многие из них являются только заголовком.   -  person Matthieu Brucher    schedule 05.01.2019
comment
@MatthieuBrucher Только что упоминалось, что libm и libc должны предоставлять только функции C.   -  person Alexey    schedule 05.01.2019
comment
en.wikipedia.org/wiki/C_mathematical_functions#libm   -  person Lightness Races in Orbit    schedule 05.01.2019
comment
@LightnessRacesinOrbit Не все функции math.h идут в libm, некоторые из них идут в libc.   -  person Alexey    schedule 05.01.2019
comment
@Алексей Скажи это Википедии; Я просто даю ссылки, не приводя никаких аргументов. Не забывайте указывать источники.   -  person Lightness Races in Orbit    schedule 05.01.2019
comment
@LightnessRacesinOrbit Я обнаружил это экспериментально. nm --dynamic --defined-only /lib/x86_64-linux-gnu/libm.so.6 | grep -w abs ничего не возвращает, а nm --dynamic --defined-only /lib/x86_64-linux-gnu/libc.so.6 | grep -w абс возвращает T абс.   -  person Alexey    schedule 05.01.2019
comment
libc и libm — это библиотеки C. Библиотека C++ — это libstdc++. Лучше пометить как вопрос C.   -  person rustyx    schedule 05.01.2019
comment
@rustyx В каком стандарте (C или C++) указано, что должны предоставлять эти библиотеки?   -  person Alexey    schedule 05.01.2019
comment
Нет стандарта. Разработчики glibc решили разделить функции на две общие библиотеки. И abs() находится в stdlib.h, а не в math.h.   -  person KamilCuk    schedule 05.01.2019
comment
Обратите внимание, что некоторые платформы не требуют связывания с -lm или его эквивалентом для получения математических функций из стандартной библиотеки C — конкретный пример — macOS. Давным-давно иметь отдельную библиотеку было разумно, потому что одно и то же базовое оборудование могло иметь или не иметь доступную арифметику с плавающей запятой (Intel 80386 с дополнительным 80387 FPU (модуль с плавающей запятой) для позднего примера — что также помогает датировать, когда это была проблема). В настоящее время это редко является проблемой; было бы разумнее сделать -lm необязательным. Правила во встроенном пространстве другие.   -  person Jonathan Leffler    schedule 05.01.2019
comment
Между прочим, в старые времена иногда были разные реализации функциональности printf() и scanf() — с поддержкой и без поддержки плавающей запятой (потому что поддержка плавающей запятой довольно велика, что имело значение, когда ваша программа была ограничена 64 КиБ).   -  person Jonathan Leffler    schedule 05.01.2019
comment
Пинг @JonathanWakely. Возможно, он сможет ответить на некоторые вопросы о системах GNU. Обычно у него уникальная проницательность.   -  person jww    schedule 05.01.2019


Ответы (1)


Языковые стандарты, такие как ISO C и ISO C++, не касаются таких вопросов, как связывание.

POSIX требует только, чтобы компилятор c99 поддерживал -lm и чтобы функции, объявленные в заголовках <math.h>, <complex.h> и <fenv.h>, были доступны для компоновки, если указано -lm. Это требование можно выполнить, если функции определены в библиотеке, которая связана по умолчанию.

В текущем glibc разделение функций в основном произвольное, с некоторыми ограничениями в текущей реализации. (Давным-давно поддерживались две библиотеки потоков, поэтому весь функционал, связанный с потоками, должен был находиться в libpthread, но сейчас это не так.) Возможны и другие подходы: musl помещает все в libc.a для статического связывания, а в динамический компоновщик для динамического связывания.

person Florian Weimer    schedule 05.01.2019
comment
macOS имеет все математические функции в основной библиотеке C. - person Jonathan Leffler; 05.01.2019
comment
Является ли glibc названием группы библиотек, одной из которых является libm? - person Alexey; 06.01.2019
comment
glibc — это название библиотеки C в системах GNU/Linux. Его реализация разделена на несколько динамических общих объектов. В большинстве архитектур они называются libc.so.6, libm.so.6, libpthread.so.0 и еще несколько. - person Florian Weimer; 06.01.2019