【问题标题】:Why am I getting "undefined reference to sqrt" error even though I include math.h header? [duplicate]即使包含 math.h 标头,为什么我会收到“未定义的 sqrt 引用”错误? [复制]
【发布时间】:2021-12-19 21:03:06
【问题描述】:

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

【问题讨论】:

  • 这里有一些关于为什么 libm 没有默认链接的猜测,即使它包含标准库的一部分:stackoverflow.com/questions/1033898/…
  • 在使用整数文字时是否有原因不会引发错误? IE。 sqrt(12345) 在没有 -lm 的情况下编译得很好。编译器在做数学吗?
  • 按照接受的答案后它仍然无法正常工作,对于一个简单的函数来说这是多么累人的操作,但是使用确切的数字调用 sqrt() 仍然可以工作

标签: c linker linker-errors libm


【解决方案1】:

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

gcc test.c -o test -lm

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

【讨论】:

    【解决方案2】:

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

    你需要编译成

    gcc test.c  -o test -lm
    

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        因为您没有告诉链接器 ma​​th 库的位置。使用 gcc test.c -o test -lm

        编译

        【讨论】:

          【解决方案5】:

          添加标题:

          #include&lt;math.h&gt;

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

          abs()- 提供绝对值;

          例如,abs(-3) =3

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

          gcc &lt;filename.extension&gt; -lm

          【讨论】:

            猜你喜欢
            • 2021-02-10
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2019-05-02
            • 2012-12-07
            • 1970-01-01
            相关资源
            最近更新 更多