为啥即使在包含 math.h 并使用 -lm 链接到数学库之后我也会收到“未定义的符号:.sqrtf”
Posted
技术标签:
【中文标题】为啥即使在包含 math.h 并使用 -lm 链接到数学库之后我也会收到“未定义的符号:.sqrtf”【英文标题】:why I am getting "Undefined symbol: .sqrtf" even after Including math.h and linking to math library using -lm为什么即使在包含 math.h 并使用 -lm 链接到数学库之后我也会收到“未定义的符号:.sqrtf” 【发布时间】:2019-05-02 06:48:30 【问题描述】:当我准备编译时
#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)上失败
类似的问题已经存在: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
并开始正常工作。
【问题讨论】:
你的代码没问题,但是把“%d”改成“%f”。 wandbox.org/permlink/Bfe2wuuplGWQl2RK 哈哈哈在这种情况下并不重要。忽略打印行。无论如何更新了代码。谢谢! 当然,不重要))) 但是代码没问题。 您可能没有安装包含/usr/lib/libm.a
-- bos.adt.libm
或类似内容的包。
【参考方案1】:
安装包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
【讨论】:
bos.adt.libm
软件包已安装。当我运行以下命令时lslpp -l | grep bos.adt.libm
。我得到`bos.adt.libm 7.1.4.0 COMMITTED Base Application Development`。我可以在我的系统上看到 usr/lib/libm.a。
一个更新:当我使用 sqrt
而不是 sqrtf
代码编译成功。当我使用命令'/user/unicore/rs6000aix/compiler/gcc4.8.5/aix6.1/bin/gcc -o test.out test.cpp -lm`来编译它时。 sqrtf
失败,无论是否链接到数学库。
向您的 AIX 供应商报告错误。
谢谢!!安装最新的bos.adt.libm
解决了这个问题。以上是关于为啥即使在包含 math.h 并使用 -lm 链接到数学库之后我也会收到“未定义的符号:.sqrtf”的主要内容,如果未能解决你的问题,请参考以下文章
为啥 GCC 为 C++ <cmath> 实现 isnan() 比 C <math.h> 更有效?