137

我对 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其他三角函数相同的错误。为什么?

4

5 回答 5

212

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

gcc test.c -o test -lm

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

于 2012-05-02T06:55:27.340 回答
34

您需要使用链接-lm器选项链接

您需要编译为

gcc test.c  -o test -lm

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

于 2012-05-02T06:55:11.787 回答
11

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

于 2012-05-02T06:55:38.743 回答
6

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

于 2012-05-02T06:56:11.923 回答
5

添加标题:

#include<math.h>

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

abs() - 提供绝对值;

例如,abs(-3) =3

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

gcc <filename.extension> -lm

于 2017-03-03T05:29:35.963 回答