为什么即使我包含 math.h 标头,我也会收到“未定义的 sqrt 引用”错误? [重复]

问题描述 投票:0回答:5

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

c linker linker-errors libm
5个回答
255
投票

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

-lm
即可:

gcc test.c -o test -lm

数学库名为

libm.so
-l
命令选项采用
lib
前缀和
.a
.so
后缀。


44
投票

您需要使用

-lm
链接器选项进行链接。

您需要编译为:

gcc test.c -o test -lm
过去,

gcc
(不是
g++
)默认情况下在链接时不会包含数学函数。它也已从 libc 中分离到一个单独的库 libm 中。要链接这些函数,您必须建议链接器包含库
-l
链接器选项,后跟库名称
m
,即
-lm
。 请注意,参数的顺序很重要,如果
-lm
紧接在
gcc
之后,则不起作用。


12
投票

这可能是链接器错误。 添加

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


6
投票

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

进行编译

6
投票

添加标题:

#include<math.h>

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

abs()-提供绝对值;

例如,abs(-3) =3

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

gcc <filename.extension> -lm

© www.soinside.com 2019 - 2024. All rights reserved.