为什么即使我包含math.h标题,我也会收到"对sqrt的未定义引用"错误?

Ant*_*t's 98 c linker linker-errors libm

我是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;
}
Run Code Online (Sandbox Code Playgroud)

但是当我编译它时:

gcc test.c -o test
Run Code Online (Sandbox Code Playgroud)

我收到这样的错误:

/tmp/cc58XvyX.o: In function `main':
test.c:(.text+0x2f): undefined reference to `sqrt'
collect2: ld returned 1 exit status
Run Code Online (Sandbox Code Playgroud)

为什么会这样?是sqrt()不是在math.h头文件中?我cosh和其他三角函数有同样的错误.为什么?

wal*_*lyk 148

构建可执行文件时,必须链接数学库.如何做到这一点因环境而异,但在Linux/Unix中,只需添加-lm命令即可:

gcc test.c -o test -lm
Run Code Online (Sandbox Code Playgroud)

数学库已命名libm.so,-l命令选项采用lib前缀和/ .a.so后缀.

  • 但这实际上很奇怪,在成为标准库之后,Linux 中的编译器不会自动链接它。 (3认同)

Abh*_*jit 25

您需要链接到链接-lm器选项

你需要编译为

gcc test.c  -o test -lm
Run Code Online (Sandbox Code Playgroud)

gcc(非g ++)历史上不会默认包含链接时的数学函数.它也已经从libc分离到一个单独的库libm上.要使用这些功能,你必须通知链接到包含链接库-l链接选项,后跟库名m这样-lm.


ckh*_*han 8

这可能是链接器错误.添加-lm开关以指定您要链接到标准C数学库(libm),该库具有这些函数的定义(标题只有它们的声明 - 值得查找差异.)


小智 6

添加标题:

#include<math.h>

注意:使用abs(),有时在评估时sqrt()可能会取负值,从而导致域错误。

abs()-提供绝对值;

例如,abs(-3) =3

在编译期间在命令末尾包含 -lm :

gcc <filename.extension> -lm


tux*_*day 5

因为您没有告诉链接器数学库的位置。用gcc test.c -o test -lm编译