提问人:Ant's 提问时间:5/2/2012 最后编辑:WolfAnt's 更新时间:2/7/2018 访问量:329228
为什么即使我包含 math.h 标头,我也会收到“undefined reference to sqrt”错误?[复制]
Why am I getting "undefined reference to sqrt" error even though I include math.h header? [duplicate]
问:
我是 C 的新手,我有以下代码:
#include <stdio.h>
#include <math.h>
int main(void)
{
double x = 0.5;
double result = sqrt(x);
printf("The square root of %lf is %lf\n", x, result);
return 0;
}
但是当我编译它时:
gcc test.c -o test
我收到这样的错误:
/tmp/cc58XvyX.o: In function `main':
test.c:(.text+0x2f): undefined reference to `sqrt'
collect2: ld returned 1 exit status
为什么会这样?不在头文件中?我和其他三角函数也遇到了同样的错误。为什么?sqrt()
math.h
cosh
答:
44赞
Abhijit
5/2/2012
#1
您需要将 与链接器选项链接-lm
您需要编译为
gcc test.c -o test -lm
gcc(不是 g++)在链接时默认不包含数学函数。它也已从 libc 分离到一个单独的库 libm 上。要链接这些函数,您必须建议链接器包含库链接器选项,后跟库名称,因此。-l
m
-lm
252赞
wallyk
5/2/2012
#2
构建可执行文件时,必须链接数学库。如何执行此操作因环境而异,但在 Linux/Unix 中,只需添加到命令中:-lm
gcc test.c -o test -lm
math 库名为 ,命令选项采用前缀和/或后缀。libm.so
-l
lib
.a
.so
评论
2赞
Ayush
12/5/2022
但这实际上很奇怪,在成为标准库之后,它并没有被 Linux 中的编译器自动链接。
0赞
wallyk
12/6/2022
这来自几十年前。在那些日子里,有广泛使用的选项来链接备用库。一个使用了协处理器。另一个在软件中实现了协处理器计算。我想我记得一个笑话库,它提示计算机操作员“快速:3.46 乘以 67.884 是多少?
0赞
lavalade
12/5/2023
值得指定必须在源文件之后,否则无论如何都会产生错误。-lm
12赞
ckhan
5/2/2012
#3
这可能是链接器错误。
添加开关以指定要链接到具有这些函数定义的标准 C 数学库 ()(标头仅包含它们的声明 - 值得查找差异。-lm
libm
6赞
tuxuday
5/2/2012
#4
因为你没有告诉链接器数学库的位置。使用 gcc test.c -o test -lm 编译
6赞
Akshat
3/3/2017
#5
添加标题:
#include<math.h>
注意:使用 abs(),有时在计算时 sqrt() 可以取负值,从而留下域错误。
abs()- 提供绝对值;
示例,abs(-3) =3
在编译期间,在命令末尾包含 -lm:
gcc <filename.extension> -lm
评论
libm
sqrt(12345)
-lm