sqrt()函数链接错误

以下代码在Linux上抛出未定义的符号错误。

$ cat rms.c /* sqrt example */ #include  #include  int main () { double param, result; param = 1024.0; result = sqrt (param); printf ("sqrt(%lf) = %lf\n", param, result ); return 0; } $ gcc rms.c /tmp/ccaWecFP.o(.text+0x24): In function `main': : undefined reference to `sqrt' collect2: ld returned 1 exit status 

如果我用(double)16替换sqrt()的参数,那么程序正在编译并执行。 为什么在第一种情况下抛出错误。

这是链接器错误。

链接器缺少sqrt()的实现。 它驻留在库libm

通过应用选项-lm告诉GCC添加它。

sqrt()的实现在数学库libm可用。

您必须将程序链接到数学库,如下所示:

 gcc rms.c -lm 

一个自然的问题是,我怎么知道这个? 答案在于联机帮助页。 如果我做“man sqrt”,我会看到以下内容。 请注意, 链接指令在概要中提供

 SYNOPSIS #include  double sqrt(double x); Link with -lm. 

您必须与libm链接

 gcc rms.c -lm 

如果您需要更多解释链接外部库 。

祝好运 ;)

正如其他答案所说,您需要传递-lm以链接到包含sqrt符号的库。

它与常量参数一起使用的原因是因为允许将sqrt实现为内置函数。 当GCC看到一个使用常量参数调用的内置函数时,它可以在编译时计算结果,而不是发出对库中外部函数的调用。