我有这个简单的代码:
max = (int) sqrt (number);
在标题中我有:
#include
但是应用程序仍然会对sqrt进行未定义的引用。 你觉得这里有什么问题吗? 看起来一切都应该没问题。
哪个抱怨,链接器或编译器? 如果你可以发布可能清除的确切错误。
编译器写这个抱怨,问题是,该应用程序甚至没有建立...
问题不在您的程序中,而是在C库的系统实现中。 它仍然遵循20世纪70年代/ 80年代的遗留惯例,其中数学函数位于单独的库中,默认情况下不链接。
您可能会发现必须在您使用的任何系统上链接数学库,例如:
gcc -o myprog myprog.c -L/path/to/libs -lm
^^^ - this bit here.
包含头文件允许编译器了解函数声明,但它不一定自动链接到执行该函数所需的代码。
如果做不到这一点,您需要向我们展示您的代码,编译命令以及您正在运行的平台(操作系统,编译器等)。
以下代码编译并链接正常:
#include
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的未解析符号出现时,为时已晚。
sry,我写的很糟糕,确定它包括...问题是,那个app甚至没有建成......
我已经通过构建加入了 - 现在我有另外的错误,但这已经解决了!谢谢
@paxdiablo:对于csqrt的Clibc?
@ user2284570,听起来好像最好发布一个问题("如何在uClibc的数学库中链接?"或类似的东西)。比评论更多的人会看到一个问题。
还要注意链接库的顺序。我发现Ive在命令行中过早 - 并且将其移动到最后解决了相关的错误消息。这似乎也依赖于gcc版本(一些旧版本并不介意)。
好的指针@KevinBullaughey我还必须将另一个链接选项移到后面(-lpthread)。
@paxdiablo非常好解释!特别是最后两段
我想你已经用#include导入了math.h
因此,我能看到的另一个原因是缺少链接信息。您必须使用-lm选项链接您的代码。
如果您只是尝试使用gcc编译一个文件,只需将-lm添加到命令行,否则,请提供有关构建过程的一些信息。
它不会构建,因为您没有正确链接,只需尝试将-lm添加到您的构建命令。
在Clibc for csqrt()的情况下?
只需在c源文件中添加#include,最后在Makefile中添加-lm对我有用。
gcc -pthread -o p3 p3.c -lm
抱歉,堆栈溢出隐藏了include语句。我刚刚制作了代码,现在它正在运行。
以下是我的观察,首先需要将头math.h包含在math.h头文件中声明的sqrt()函数中。例如
#include
其次,如果您阅读sqrt的手册页,您会注意到此行与-lm链接。
#include /* header file you need to include */
double sqrt(double x); /* prototype of sqrt() function */
Link with -lm. /* Library linking instruction */
But application still says undefined reference to sqrt. Do you see any
problem here?
编译器错误是正确的,因为您没有将程序与库lm链接并且链接器无法找到sqrt()的引用,您需要显式链接它。例如
gcc -Wall -Wextra -Werror -pedantic test.c -lm
我有同样的问题,但我只是通过在运行我的代码的命令后添加-lm来解决它。
例。
gcc code.c -lm
这与几年前发布的其他答案有何不同?