为什么即使在包含math.h并使用-lm链接到数学库之后,我仍然得到“未定义符号:.sqrtf”

时间:2018-11-30 05:57:24

标签: c++ unix linker aix math.h

当我尝试编译时

#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:错误:ld返回8退出状态

但是下面的代码可以成功编译

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

我正在使用gcc4.8.5编译代码..相同的代码在AIX6.1上成功编译,但是在新机器(AIX7.1)上失败

与此类似的问题已经存在:Why am I getting "undefined reference to sqrt" error even though I include math.h header?,但对我不起作用。

更新:当我使用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

编辑3:安装了bos.adt.libm.7.1.3.47,但没有sqrtf。安装了bos.adt.libm.7.1.4.30.bff,它开始正常运行。

1 个答案:

答案 0 :(得分:3)

安装软件包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