对sqrt(或其他数学函数)的未定义引用

时间:2011-03-09 16:32:55

标签: c linker-errors undefined-reference

我有这个简单的代码:

max = (int) sqrt (number);

在标题中我有:

#include <math.h>

但是应用程序仍然会对sqrt进行未定义的引用。你觉得这里有什么问题吗?看起来一切都应该没问题。

5 个答案:

答案 0 :(得分:85)

您可能会发现必须在您使用的任何系统上链接数学库,例如:

gcc -o myprog myprog.c -L/path/to/libs -lm
                                       ^^^ - this bit here.

包含头文件可让编译器了解函数声明,但它 not 必然会自动链接到执行该函数所需的代码。

如果不这样做,您需要向我们展示您的代码,编译命令以及您正在运行的平台(操作系统,编译器等)。

以下代码编译并链接正常:

#include <math.h>
int main (void) {
    int max = sqrt (9);
    return 0;
}

请注意,某些编译系统取决于命令行中给定库的顺序。这样,我的意思是他们可以按顺序处理库,只使用它们来满足序列中该点的未解析符号

因此,例如,给定命令:

gcc -o plugh plugh.o -lxyzzy
gcc -o plugh -lxyzzy plugh.o

plugh.o需要xyzzy库中的内容,第二个可能无法按预期工作。在列出库的位置,没有任何未解析的符号可以满足。

plugh.o 的未解析符号出现时,为时已晚。

答案 1 :(得分:24)

我想你已经用#include <math.h>

导入了math.h

因此,我能看到的另一个原因是缺少链接信息。您必须使用-lm选项链接您的代码。

如果您只是尝试使用gcc编译一个文件,只需将-lm添加到命令行,否则,请提供有关构建过程的一些信息。

答案 2 :(得分:3)

只需在c源文件中添加<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script> <input type="text">,在最后添加Makefile中的-lm就可以了。

#include <math.h>

答案 3 :(得分:1)

这是我的观察,首先您需要将头文件@GetMapping/@PostMapping包含在math.h头文件中声明的sqrt()函数中。对于例如

math.h

其次,如果您阅读sqrt的手册页,则会注意到此行与-lm的链接。

#include <math.h>
  

但是应用程序仍然说未定义对sqrt的引用。你看到了吗   这里有问题吗?

编译器错误是正确的,因为您尚未将程序与库#include <math.h> /* header file you need to include */ double sqrt(double x); /* prototype of sqrt() function */ Link with -lm. /* Library linking instruction */ 链接,并且链接器无法找到lm的引用,您需要显式链接。对于例如

sqrt()

答案 4 :(得分:0)

我有同样的问题,但我只是通过在运行我的代码的命令后添加-lm来解决它。 例。 gcc code.c -lm