mitix: Странности с math.h

8 сообщений / 0 new
Последнее сообщение
Гость
mitix: Странности с math.h

Ничего не могу понять.
Есть 2 программки для примера.
1 - ая
---------------------------------------------
#include <stdio.h>
#include <math.h>

int main()
{
double i,j,k;
i=2.0;
j=3.0;
k=pow(i,j);
printf("%f",k);
return 0;
}
---------------------------------------------
Далее
$ gcc -o test test.c
/tmp/ccgGyiek.o(.text+0x30): In function `main':
: undefined reference to `pow'
collect2: ld returned 1 exit status

Не компилит, говорит, что функция pow ей неведома.

Далее 2ая программка
---------------------------------------------
#include <stdio.h>
#include <math.h>

int main()
{
double i = -4.5;
printf("%f",fabs(i));
return 0;
}
---------------------------------------------

Она компилится нормально.
Но ведь и функция pow и fabs подрубаются через math.h
Почему тогда pow не работает, а fabs работает?
В чем может быть проблема?
Заранее спасибо.

<span class='smallblacktext'>[ Редактирование ]</span>

mitix (не проверено)

Насколько я понял:
$ gcc -c test.c
Получили test.o
Далее:
$ ld -lm -o test test.o
Выдает:
ld: warning: cannot find entry symbol _start; defaulting to 0000000008048208
Cоздается исполняемый файл "test", но вот исполняться он совсем не хочет (с правами все нормально). Не запускается видимо оттого, что не может найти метку _start. Но вот почему?

xoxa (не проверено)

[xoxa@firebird xoxa]$ cat test.c
#include <stdio.h>
#include <math.h>

int main()
{
double i,j,k;
i=2.0;
j=3.0;
k=pow(i,j);
printf("%f",k);
return 0;
}

[xoxa@firebird xoxa]$ gcc test.c -lm -o test
[xoxa@firebird xoxa]$ ./test
8.000000[xoxa@firebird xoxa]$

mitix (не проверено)

Понял. Заработало.
Но почему по-умолчанию не работало?
Последний вопрос, если можно, куда мне это прописать, чтобы каждый раз этого не делать. Я использую KDevelop.
Спасибо.

Nick
Не в сети
Зарегистрирован: 20/09/2010

[quote=mitix]
Но почему по-умолчанию не работало?
[/quote]
А оно должно догадаться, какие бибилиотеки линковать?

[quote=mitix]
Последний вопрос, если можно, куда мне это прописать, чтобы каждый раз этого не делать.
[/quote]
В Makefile

Nick
Не в сети
Зарегистрирован: 20/09/2010

Эти функции содержатся в библиотеке libm. Соответвенно, компоновщику надо указать -lm
Там же сказано: "ld returned". ld -- это компоновщик, а не компилятор.

А fabs нашелся ,скорее всего, оттого, что это builtin или макрос.

mitix (не проверено)

Все, народ, большое спасибо, вроде разобрался.

Vitls
Аватар пользователя Vitls
Не в сети
Зарегистрирован: 21/09/2010

[quote=mitix]Понял. Заработало.
Но почему по-умолчанию не работало?
Последний вопрос, если можно, куда мне это прописать, чтобы каждый раз этого не делать. Я использую KDevelop.
Спасибо.
[/quote]
Укажите в проекте.

Дело не в том как болезнь вылечить.
Дело в том как других заразить.

RSS-материал