Для каких функций предназначена библиотека 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 для статической компоновки и в динамический компоновщик для динамической компоновки.

Другие вопросы по тегам