Отправляет email-рассылки с помощью сервиса Sendsay

как достать мат. функции в С ???

Привет всем!

Ситуация комичная - или я дурак, или одно из двух :))
Код:
// test.c
#include <stdio.h>
#include <math.h>
#include <tgmath.h>

main (void)
{
float i, j;

i = floor(14.7);
j = sin(0.5);
printf("%f\n", j);
}

(Пробовал math.h и tgmath.h раздельно и вместе)

Собирается с криками:
# gcc test.c
/home/mat/tmp/ccgb7ico.o: In function `main':
/home/mat/tmp/ccgb7ico.o(.text+0x14): undefined reference to `floor'
/home/mat/tmp/ccgb7ico.o(.text+0x2f): undefined reference to `sin'
collect2: ld returned 1 exit status

В манах сказано, что #include <math.h> должно хватить, последующий поиск в /usr/include
вывел на
#include <tgmath.h>, который тоже не помог. Как я понимаю, линкер не цепляет
код этих функций по
умолчанию. Как изменить умолчание, и какую, собственно, библиотеку цеплять?

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 9858; Возраст листа: 361; Участников: 1234
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/195567



-*Информационный канал Subscribe.Ru
Адрес подписки:
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Отписать: mailto:comp.soft.linux.discuss--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Matvey Wed, 21 Jul 2004 16:09:17 +0300 (#195567)

 

Ответы:

On Среда 21 Июль 2004 17:09, Matvey wrote:

cc test.c -lm

#include тут не при чём - это нужно линкеру.

Ответить   "Sergey B. Khvatov" Wed, 21 Jul 2004 18:36:03 +0400 (#195570)

 

On Wed, 21 Jul 2004 18:36:03 +0400
"Sergey B. Khvatov" <xbat***@t*****.ru> wrote:

Спасибо.
А можно как-то сконфигурить gcc чтобы он сам цеплял? (в идеале - толькокогда
надо)

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 9869; Возраст листа: 361; Участников: 1234
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/195764



-*Информационный канал Subscribe.Ru
Адрес подписки:
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Отписать: mailto:comp.soft.linux.discuss--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Matvey Wed, 21 Jul 2004 22:33:54 +0300 (#195764)

 

On Wed, Jul 21, 2004 at 10:33:54PM +0300, Matvey wrote:

Нет. Потому что:

а) идеологическая сторона: это Unix, а поэтому программы хороши
ненавязчивостью, а не ламерством и тотальным Plug&Play'ем.

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

Только когда надо -- технически пока никак (при современном уровне
технологий исскуственного интеллекта или во всяком случае GCC ;-).
Для иллюстрации -- проанализируйте вывод `cc -v', при компиляции
программы. Для примера:

% cat >file.c
#include <math.h>
#include <stdio.h>

int main(void)
{
double d = sin(3.1415927/2);
printf("%f\n", d);
return 0;
}
% cc -v -lm file.c
Reading specs from /usr/lib/gcc-lib/i386-unknown-openbsd3.5/2.95.3/specs
gcc version 2.95.3 20010125 (prerelease, propolice)

Это было фуфло разное про gcc, далее вызов препроцессора:

/usr/lib/gcc-lib/i386-unknown-openbsd3.5/2.95.3/cpp0 -lang-c -v \
-D__GNUC__=2 -D__GNUC_MINOR__=95 -D__unix__ -D__ELF__ -D__i386__ \
-D__OpenBSD__ -D__unix__ -D__ELF__ -D__i386__ -D__OpenBSD__ \
-Asystem(unix) -Asystem(OpenBSD) -Acpu(i386) -Amachine(i386) file.c \
/tmp//cce28377.i
GNU CPP version 2.95.3 20010125 (prerelease, propolice) (80386, ATT syntax)
#include "..." search starts here:
#include <...> search starts here:
/usr/include
End of search list.
The following default directories have been omitted from the search path:
/usr/include/g++
End of omitted list.

Препроцессор отработал: у нас есть файл с исходником + все из
/usr/include/stdio.h и /usr/include/math.h. Далее про то, что мы инклудим
никто не знает. Теперь оттранслируем из C в ассемблер для процессора текущей
архитектуры:

/usr/lib/gcc-lib/i386-unknown-openbsd3.5/2.95.3/cc1 /tmp//cce28377.i \
-quiet -dumpbase file.c -version -o /tmp//ccf28377.s
GNU C version 2.95.3 20010125 (prerelease, propolice) \
(i386-unknown-openbsd3.5) compiled by GNU C version 2.95.3 20010125 \
(prerelease, propolice).

Создан исходник на ассемблере, теперь можно компилировать объектный модуль:

as -V -Qy -o /tmp//ccm28377.o /tmp//ccf28377.s
GNU assembler version 2.11.2 (i386-unknown-openbsd3.5) using BFD \
version 2.11.2

Объектник создан. Можно линковать. И вот только теперь нам нужна -lm!
До этого момента о ней никто не думал....

/usr/lib/gcc-lib/i386-unknown-openbsd3.5/2.95.3/collect2 -e __start \
-Bdynamic -dynamic-linker /usr/libexec/ld.so /usr/lib/crt0.o \
/usr/lib/crtbegin.o -L/usr/lib/gcc-lib/i386-unknown-openbsd3.5/2.95.3 \
-lm /tmp//ccm28377.o -lgcc -lc -lgcc /usr/lib/crtend.o

Вот вызывается линкер (ld.so) с дефолтными опциями -lc, -lgcc и здесь же
вспоминают про -lm.

Вот так это работает...

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 9874; Возраст листа: 362; Участников: 1234
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/195849



-*Информационный канал Subscribe.Ru
Адрес подписки:
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Отписать: mailto:comp.soft.linux.discuss--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Thu, 22 Jul 2004 04:42:30 +0400 (#195849)

 

Здравствуйте!

В среду, 21-го июля 2004, в 23:33:54 по московскому времени
(среда, 22:33 (GMT +0300) на часах автора исходного письма)
Matvey написал:

Рекомендую написать простенький Makefile. Времени много не займёт, а
команда компиляции будет всего из четырёх букв.

Ответить   Thu, 22 Jul 2004 12:49:12 +0400 (#196046)

 

Hello Matvey,

Попробуй вместо gcc g++

Best regards,
teremok1 mailto:teremo***@m*****.ru

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 9862; Возраст листа: 361; Участников: 1234
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/195633



-*Информационный канал Subscribe.Ru
Адрес подписки:
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Отписать: mailto:comp.soft.linux.discuss--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Wed, 21 Jul 2004 19:06:06 +0400 (#195633)

 

On Wed, 21 Jul 2004 19:06:06 +0400
teremok1 <teremo***@m*****.ru> wrote:

А ты сам попробуй:)
Там столько варнингов насыпалось да еще и не собралось, что меня совсем не удивило
:)
И в любом случае, собирать Сишный исходник с помощью С++ ....

-*Название листа "Linux: разрешение вопросов, перспективы и общение";
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Адрес правил листа http://subscribe.ru/catalog/comp.soft.linux.discuss/rules
Номер письма: 9870; Возраст листа: 361; Участников: 1234
Адрес сайта рассылки: http://www.linuxrsp.ru
Адрес этого письма в архиве: http://subscribe.ru/archive/comp.soft.linux.discuss/msg/195765



-*Информационный канал Subscribe.Ru
Адрес подписки:
Написать в лист: mailto:comp.soft.linux.discuss-list@subscribe.ru
Отписать: mailto:comp.soft.linux.discuss--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Matvey Wed, 21 Jul 2004 22:37:44 +0300 (#195765)