为什么我得到“未定义的引用sqrt”错误,即使我包含math.h头?

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

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

 gcc test.c -o test -lm 

math库命名为libm.so-l命令选项假设lib前缀和.a.so后缀。

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

你需要编译为

 gcc test.c -o test -lm 

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

这可能是一个链接器错误。 添加-lm开关以指定要链接到具有这些函数定义的标准Cmath库( libm )(头文件只是声明它们 – 值得查看其差异)。

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

您必须将头文件math.h与您的代码链接起来。 你可以通过在你的命令后面input-lm来做到这一点。

添加标题:

#include<math.h>

注意:使用abs(),有时在求值的时候sqrt()可以取负值,这就是域错误。

abs() – 提供绝对值;

例如,abs(-3)= 3

在编译期间在命令末尾加上-lm:

gcc <filename.extension> -lm