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看到一个使用常量参数调用的内置函数时,它可以在编译时计算结果,而不是发出对库中外部函数的调用。