LINUX.ORG.RU

Не знаю, когда он этого не требовал, но одной из причин неведения может быть использование builtin реализаций и/или макросов, тогда и без библиотеки может работать.

xaizek ★★★★★
()

вообще всегда требовал, но иногда бывало что работало без -lm. видимо, в некоторых версиях gcc / настройках компиляции / оптимизации, подтаскиваются builtin, и тогда -lm не нужен.

было бы тоже интересно узнать точную причину, почему иногда без -lm код собирается и работает.

waker ★★★★★
()

С каких пор gcc требует линковать с мат либой при использовании <math.h>?

Где-то с 1995 года.

i-rinat ★★★★★
()
Ответ на: комментарий от someoneelsenotme
 pony cat pony.c  
#include <stdio.h>
#include <math.h>

int main(void)
{
int i;
for (i = 0; i < 64; i++)
{
	printf("%f\n", sin(i + 1));
}
return 0;
}
➜  pony cat pony.cpp
#include <iostream>
#include <math.h>

int main(void)
{
int i;
for (i = 0; i < 64; i++)
{
	std::cout << sin(i + 1) << std::endl;
}
return 0;
}
➜  pony gcc pony.c
/tmp/cc6V89tE.o: In function `main':
pony.c:(.text+0x20): undefined reference to `sin'
collect2: error: ld returned 1 exit status
➜  pony g++ pony.cpp
➜  pony 

В СИшном около всегда надо было линковать math

fornlr ★★★★★
()
Последнее исправление: fornlr (всего исправлений: 1)
Ответ на: комментарий от fornlr
alex@alex:~/Проекты/test/md5$ cat ./prony.c
#include <math.h>
#include <stdio.h>

int main(void) 
{ 
    printf("%f\n", sin(1)); 
    return 0; 
}
alex@alex:~/Проекты/test/md5$ gcc prony.c -o prony.c
alex@alex:~/Проекты/test/md5$ ./prony
0.841471

someoneelsenotme
() автор топика
Ответ на: комментарий от someoneelsenotme

sin(1)

Может компилятор оптимизирует это до константы и потому библиотеку не требует. Ты переменную подставь

Harald ★★★★★
()
Ответ на: комментарий от Harald

Может компилятор оптимизирует это до константы и потому библиотеку не требует

Если так, я буду нереально удивлен... А может дело в его системе сборки? Например, qmake вероятно может что-то своего подпихнуть, в том числе -lm

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

где ты видишь систему сборки в его сообщении?

Harald ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Да хоть в echo:

alex@alex:~/Проекты/test/md5/test2$ echo -e '#include <math.h>\n\
> #include <stdio.h>\n\
> \
> int main(void)\
> {\
>     printf("%f\\n", sin(1));\
>     return 0;\
> }' > prony.c && gcc -O0 ./prony.c -o prony && ./prony
0.841471

someoneelsenotme
() автор топика
Ответ на: комментарий от fornlr

А можно показать место в исходниках, которое может быть оптимизировано, там что - макрос или чо.

I-Love-Microsoft ★★★★★
()
#include <math.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
	float a = 1;
	printf("%f\n", sin(a));
	return EXIT_SUCCESS;
}


$ c99 lmtest.c -o lmtest
/tmp/ccGwtzj7.o: In function `main':
lmtest.c:(.text+0x1e): undefined reference to `sin'
collect2: error: ld returned 1 exit status


#include <math.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
	printf("%f\n", sin(5));
	return EXIT_SUCCESS;
}

$ c99 lmtest.c -o lmtest
$ ./lmtest 
-0.958924

reprimand ★★★★★
()
Последнее исправление: reprimand (всего исправлений: 1)

Сколько себя помню — всегда было нужно.

utf8nowhere ★★★
()
Ответ на: комментарий от someoneelsenotme

А ты не знал, что гцц внутри имеет нагромождение неотлаживаемого легаси кода с хрен знает каких времён? Я даже не удивлен.

reprimand ★★★★★
()
Ответ на: комментарий от someoneelsenotme

вообще, ЕМНИП константные рассчеты могут свободно считаться компилятором независимо от уровня оптимизации.

printf("%d\n", 5+5);
тут компилятор будет оптимизировать при -O0 или нет?

Вот, наверное, такая же логика и с sin(1), ибо это можно посчитать и в compile-time. Как следствие, нет смысла линковаться с либой, символы из которой не используются.

reprimand ★★★★★
()
Последнее исправление: reprimand (всего исправлений: 1)

Это еще что, насколько я помню, что если в define будет вычитание двух длинных чисел, которые никуда бы не влезли, но в результате получится маленькое число, то благополучно вычислит и соберется — то есть длинная арифметика там тоже реализована.

CrossFire ★★★★★
()
Последнее исправление: CrossFire (всего исправлений: 1)
Ответ на: комментарий от CrossFire

а вот помнится в Turbo C её не было, и компилятор смело отрезал старшие байты, не выдавая никакой ошибки )

Harald ★★★★★
()

ещё в прошлом веке так было. инфа 100°/o

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.