почему я получаю «Неопределенный символ: .sqrtf» даже после включения math.h и ссылки на библиотеку математики с помощью -lm - PullRequest
0 голосов
/ 30 ноября 2018

когда я пытаюсь скомпилировать

#include <math.h>
#include <stdio.h>
int main()
{
   double m=1.66666;
   double k=sqrtf(m);
   return 0;
}

, используя следующую команду

/user/unicore/rs6000aix/compiler/gcc4.8.5/aix6.1/bin/gcc -o test.out test.cpp -lm

, он выдает

ld: 0711-317 ERROR: Undefined symbol: .sqrtf

ld: 0711-345 Использовать -bloadmapили опция -bnoquiet для получения дополнительной информации.collect2: error: ld вернул 8 состояние выхода

Но приведенный ниже код успешно компилируется

#include <math.h>
#include <stdio.h>
int main()
{
   double k=sqrtf(1.66666);
   return 0;
}

Я использую gcc4.8.5 для компиляции кода. Аналогичный код успешно компилируется в AIX6.1, нона новом компьютере происходит сбой (AIX7.1)

Подобный вопрос уже существует на этом: Почему я получаю ошибку «неопределенная ссылка на sqrt», даже если я включаю заголовок math.h? но это не работает для меня.

Обновление: когда я использую sqrt вместо sqrtf, код компилируется успешно, использование команды '/user/unicore/rs6000aix/compiler/gcc4.8.5/aix6.1/bin/gcc -o test.out test.cpp -lm to compile it. sqrtf` завершается неудачно с или без ссылки на библиотеку математики.

edit2: вывод команды nm

$ nm -g -X32 /usr/lib/libm.a | grep sqrtf
.csqrtf              T         512
csqrtf               D        4196          12

$ nm -g -X64 /usr/lib/libm.a | grep sqrtf
.csqrtf              T         512
csqrtf               D        4296          24

edit 3: bos.adt.libm.7.1.3.47 был установлен без sqrtf.Установил bos.adt.libm.7.1.4.30.bff и начал нормально работать.

1 Ответ

0 голосов
/ 30 ноября 2018

Установить пакет bos.adt.libm.Или попросите системного администратора сделать это.

-

Редактировать: вызов функции sqrtf в вашем коде вполне может быть оптимизирован, так как он может быть рассчитан каквремя, а также результат никогда не используется.Вот фактический пример:

#include <math.h>
#include <stdio.h>
int main (int argc,char **argv)
{
    double val, k;

    if (argc>1) val= strtod (argv[1], NULL);
    else        val= 1.66666;

    k=sqrtf (val);
    printf ("val=%g k=%g\n", val, k);

    return 0;
}

Компиляция:

gcc -o sid_math sid_math.c -Wl,-bmap:sid_math.map # fails
gcc -o sid_math sid_math.c -lm -Wl,-bmap:sid_math.map # works

- Редактировать: также вы должны изучить содержимое libma.a, например:

$ nm -g -X32 /usr/lib/libm.a | grep sqrtf
.csqrtf              T         512
csqrtf               D        4132          12
.sqrtf               T         480
sqrtf                D        6364          12

$ nm -g -X64 /usr/lib/libm.a | grep sqrtf
.csqrtf              T         512
csqrtf               D        4232          24
.sqrtf               T         480
sqrtf                D        6616          24
...