LINUX.ORG.RU

линкер ругается на cos() , -lm не помогает


0

0

Добрый день, всех с праздником.

Вроде пишу простую прогу с использованием функции cos() подключаю библиотеку для линковки -lm , она вроде бы на месте в /lib/libm.so версия 2.5.1, если я правильно понял. Однако линкер говорит, что не знает откуда взять cos()

вопрос - какую библиотеку надо подсовывать линкеру, чтобы он корректно линковал прогу? Вроде раньше таких чудес не было?

Дистриб altlinux обновлённый sisyphus

anonymous

показывай минимальный код на котором проявляется, строку компиляции и сообщения об ошибках

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

[yan@localhost math]$ cat ./math.c
#include <stdio.h>
#include <math.h>

int main( void ) {

long double  a = 0, b = 0;

printf( "cos=%f\n", cos( a ) );

return( 0 );
}

[yan@localhost math]$ gcc -lm ./math.c
/home/yan/tmp/ccqm59xF.o: In function `main':
math.c:(.text+0x53): undefined reference to `cos'
collect2: выполнение ld завершилось с кодом возврата 1
[yan@localhost math]$

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

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

int main( void ) {

long double  a = 0, b = 0;

printf( "cos=%f\n", cos( a ) );

return( 0 );
}

McPi% gcc -lm math.c 
McPi% ./a.out 
cos=1.000000
McPi% 

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

Не воспроизводится. Может чего не дообновилось? glibc-devel и glibc одинаковых версий стоят? binutils попробуй обновить.

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

Проверь - есть ли симлинки
bash-3.2$ ls -l /usr/lib | grep libm.so
lrwxrwxrwx 1 root root 19 2008-02-02 12:11 libm.so -> ../../lib/libm.so.6
bash-3.2$ ls -l /lib | grep libm.so.6
lrwxrwxrwx 1 root root 13 2008-02-02 12:11 libm.so.6 -> libm-2.6.1.so
ну и сам файл libm (у меня версия glibc 2.6.1 - libm-2.6.1.so)

koTuk
()
Ответ на: комментарий от dilmah

[yan@localhost math]$ gcc ./math.c -lm [yan@localhost math]$ [yan@localhost math]$ [yan@localhost math]$ ls a.out math.c [yan@localhost math]$ ./a.out cos=1.000000 [yan@localhost math]$

с чем связано сие чудо?

anonymous
()
Ответ на: комментарий от koTuk

[yan@localhost math]$ ls -l /usr/lib | grep libm.so lrwxrwxrwx 1 root root 19 Май 9 18:44 libm.so -> ../../lib/libm.so.6 [yan@localhost math]$ ls -l /lib | grep libm.so.6 lrwxrwxrwx 1 root root 14 Май 9 19:50 libm.so -> /lib/libm.so.6 lrwxrwxrwx 1 root root 13 Май 9 18:43 libm.so.6 -> libm-2.5.1.so [yan@localhost math]$ ls /lib/libm-2.5.1.so /lib/libm-2.5.1.so [yan@localhost math]$

anonymous
()

она вроде бы на месте в /lib/libm.so

У меня "на месте" - /usr/lib/libm.so. Проверь симлинки.

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

с этим всё корректно, помогло вот это:

>попробуй -lm поставить в конце

>dilmah **** (*) (09.05.2008 22:04:11)

не понятно, почему -lm нельзя поставить вначале

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

> не понятно, почему -lm нельзя поставить вначале

это историческое поведение линкера на юниксе -- если в командной строке указана библиотека, то в ней осуществляется поиск только для того кода который уже откомпилирован (который до этой опции указан).

В gnu это вроде давно изменили -- можно где угодно ставить.

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

> В gnu это вроде давно изменили -- можно где угодно ставить.

В GNU все в точности так же, можно лишь указать блок, который будет пройден несколько раз для разрешения всех unresolved символов. Проблем с очередью линковки, как правило, нет при использовании динамических библиотек.

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