当我尝试编译时
#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
,它开始正常运行。
答案 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