Для каких функций предназначена библиотека 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?
1 ответ
Языковые стандарты, такие как ISO C и ISO C++, не касаются таких вопросов, как связывание.
POSIX требует только, чтобы c99
поддерживает компилятор -lm
и что функции объявлены в заголовках <math.h>
, <complex.h>
а также <fenv.h>
доступны для ссылки, если -lm
указан. Это требование можно выполнить, если функции определены в библиотеке, которая связана по умолчанию.
В текущем glibc разделение функций по большей части произвольно, с некоторыми ограничениями в текущей реализации. (Давным-давно поддерживались две библиотеки потоков, поэтому все функции, связанные с потоками, должны были libpthread
, но это уже не так.) Возможны другие подходы: musl помещает все в libc.a
для статической компоновки и в динамический компоновщик для динамической компоновки.