为什么即使我包含 math.h 标头,我也会收到“undefined reference to sqrt”错误?[复制]

Why am I getting "undefined reference to sqrt" error even though I include math.h header? [duplicate]

提问人:Ant's 提问时间:5/2/2012 最后编辑:WolfAnt's 更新时间:2/7/2018 访问量:329228

问:

我是 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.hcosh

c 链接器 链接器错误 libm

评论

1赞 Michael Burr 5/2/2012
这里有一些关于为什么默认情况下不链接的推测,即使它包含标准库的一部分:stackoverflow.com/questions/1033898/......libm
0赞 alk 5/2/2012
这是这个的副本:stackoverflow.com/q/5248919/694576
0赞 Brydon Gibson 7/18/2018
使用整数文字时不会抛出错误,这是有原因的吗?即。 编译良好,没有 .编译器是否在进行数学运算?sqrt(12345)-lm
0赞 Phong Nguyen 12/31/2018
在我遵循公认的答案后它仍然不起作用,对于一个简单的函数来说,这是一个多么累人的动作,但是使用确切的数字调用sqrt()仍然有效

答:

44赞 Abhijit 5/2/2012 #1

您需要将 与链接器选项链接-lm

您需要编译为

gcc test.c  -o test -lm

gcc(不是 g++)在链接时默认不包含数学函数。它也已从 libc 分离到一个单独的库 libm 上。要链接这些函数,您必须建议链接器包含库链接器选项,后跟库名称,因此。-lm-lm

252赞 wallyk 5/2/2012 #2

构建可执行文件时,必须链接数学库。如何执行此操作因环境而异,但在 Linux/Unix 中,只需添加到命令中:-lm

gcc test.c -o test -lm

math 库名为 ,命令选项采用前缀和/或后缀。libm.so-llib.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 数学库 ()(标头仅包含它们的声明 - 值得查找差异。-lmlibm

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