我有这个简单的代码:
max = (int) sqrt (number);
在标题中我有:
#include <math.h>
但是应用程序仍然会对sqrt
进行未定义的引用。你觉得这里有什么问题吗?看起来一切都应该没问题。
答案 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>
因此,我能看到的另一个原因是缺少链接信息。您必须使用-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