Почему библиотека libm.so линкуется БЕЗ явного указания? ((без -lm))

Модератор: Модераторы разделов

Ответить
Аватара пользователя
жучара
Сообщения: 950
ОС: астралинукс

Почему библиотека libm.so линкуется БЕЗ явного указания?

Сообщение жучара »

Друзья!

Код: Выделить всё

//main.c
#include <stdio.h>
#include <math.h>

int main ()
{
    printf ("%f\n", sin(3));
}

Shell

user@astra:~$ gcc main.c
user@astra:~$
Так не пойдёт. Я явно указываю компилятор gcc и расширение *.c. И жду, что компилятор так и будет воспринимать этот код, как язык Си, и ругаться на то, что sin не определена. Если синтаксис не соответствует языку Си, тоже жду ругань. Пока же у меня то предположение, что компилятор за меня решает, что это язык С++, а для этого языка, как известно, не нужно указывать -lm. Не нужно мне такое поведение компилятора даром.

Спасибо, кто откликнется.
Я просто читаю маны.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: Почему библиотека libm.so линкуется БЕЗ явного указания?

Сообщение /dev/random »

Почему библиотека libm.so линкуется БЕЗ явного указания?
Она не линкуется. Можете сами проверить с помощью ldd. В вашем случае вызывается встроенная gcc-шная функция, а не функция из математической библиотеки. Стандарт языка этого не требует, но и не запрещает. Кстати, если бы линковалась, это тоже было бы нормально. Это тоже не требуется, но и не запрещено.
Спасибо сказали:
MiK13
Сообщения: 1180
ОС: Linux Debian

Re: Почему библиотека libm.so линкуется БЕЗ явного указания?

Сообщение MiK13 »

А по-моему, в этом примере вообще никакая математическая функция не вызывается.
Компилятор вычисляет значение sin(3) на этапе компиляции.

Shell

mik13@mik13:/run/shm$ cat ts1.c
#include <stdio.h>
#include <math.h>
double s;
int main () {
s=3;
printf ("%f\n",sin(s));
}
mik13@mik13:/run/shm$ gcc ts1.c
/tmp/ccJB5F7y.o: In function `main':
ts1.c:(.text+0x29): undefined reference to `sin'
collect2: error: ld returned 1 exit status[sh]
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5289
ОС: Gentoo

Re: Почему библиотека libm.so линкуется БЕЗ явного указания?

Сообщение /dev/random »

MiK13 писал:
16.08.2019 18:59
А по-моему, в этом примере вообще никакая математическая функция не вызывается.
Компилятор вычисляет значение sin(3) на этапе компиляции.
Да, в мануале сказано, что встроенные функции, являющиеся заменой библиотечных, вызываются только "в некоторых случаях", и если критерии не соблюдены, то вызываются библиотечные функции. Что за критерии, мануал умалчивает, но в большинстве случаев это возможность выполнить функцию на этапе компиляции.
Спасибо сказали:
Ответить