我有这个简单的代码:未定义的引用的sqrt(或其他数学函数)
max = (int) sqrt (number);
,并在标题中,我有:
#include <math.h>
但应用程序仍然说未定义参考sqrt
。你在这里看到什么问题吗?它看起来像一切都应该没问题。
我有这个简单的代码:未定义的引用的sqrt(或其他数学函数)
max = (int) sqrt (number);
,并在标题中,我有:
#include <math.h>
但应用程序仍然说未定义参考sqrt
。你在这里看到什么问题吗?它看起来像一切都应该没问题。
你会发现你有你使用任何对系统的数学库,像链接:
gcc -o myprog myprog.c -L/path/to/libs -lm
^^^ - this bit here.
包括标题可以让编译器知道函数的声明,但它确实不一定自动链接到执行该功能所需的代码。
如果不成功,您需要向我们展示您的代码,编译命令以及您正在运行的平台(操作系统,编译器等)。
下面的代码编译和链接罚款:
#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
的未解决符号出现时,已经太晚了。
sry,我已经写得很糟糕,确定它包括...问题是,该应用程序甚至没有建立... – Waypoint 2011-03-09 16:40:06
我有addet那里-lm通过构建,现在我有另一个错误,但这是解决!谢谢 – Waypoint 2011-03-09 16:47:08
@paxdiablo:以及[μClibc](https://bugs.gentoo.org/show_bug.cgi?id=549860)为csqrt的情况? – user2284570 2015-05-18 23:37:49
我想您已经导入文件math.h与#include <math.h>
所以,唯一的其他原因,我可以看到的是一个缺少链接信息。您必须将您的代码与-lm
选项相关联。
如果您只是想用gcc编译一个文件,只需在您的命令行中添加-lm
,否则,请提供有关您的构建过程的一些信息。
它不会生成,因为您的链接不正确,只需在您的building命令中添加'-lm'即可。 – krtek 2011-03-09 16:43:30
对于csqrt(),[μClibc](https://bugs.gentoo.org/show_bug.cgi?id=549860)的情况? – user2284570 2015-05-18 23:39:24
我有同样的问题,但我只是通过在运行我的代码的命令后面添加-lm来解决它。 示例。 gcc code.c -lm
只需在c源文件中添加#include <math.h>
,最后在Makefile中添加-lm将适用于我。
gcc -pthread -o p3 p3.c -lm
对不起,include语句被堆栈溢出隐藏。我刚刚做了代码,现在它正在工作。 – 2017-07-12 21:53:32
哪位抱怨,链接器或编译器?如果您可以发布可能会清除问题的确切错误。 – Tommy 2011-03-09 16:36:00
编译器编写这个抱怨,问题是,该应用程序甚至没有建立... – Waypoint 2011-03-09 16:40:50
这个问题不在你的程序中,而是在你的系统的C库实现中。它仍然遵循1970年代/ 1980年代遗留的惯例,数学函数在单独的库中,默认情况下不会链接。 – 2011-03-09 18:52:38