2011-03-09 62 views
45

我有这个简单的代码:未定义的引用的sqrt(或其他数学函数)

max = (int) sqrt (number); 

,并在标题中,我有:

#include <math.h> 

但应用程序仍然说未定义参考sqrt。你在这里看到什么问题吗?它看起来像一切都应该没问题。

+0

哪位抱怨,链接器或编译器?如果您可以发布可能会清除问题的确切错误。 – Tommy 2011-03-09 16:36:00

+0

编译器编写这个抱怨,问题是,该应用程序甚至没有建立... – Waypoint 2011-03-09 16:40:50

+5

这个问题不在你的程序中,而是在你的系统的C库实现中。它仍然遵循1970年代/ 1980年代遗留的惯例,数学函数在单独的库中,默认情况下不会链接。 – 2011-03-09 18:52:38

回答

73

你会发现你有你使用任何对系统的数学库,像链接:

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的未解决符号出现时,已经太晚了。

+0

sry,我已经写得很糟糕,确定它包括...问题是,该应用程序甚至没有建立... – Waypoint 2011-03-09 16:40:06

+0

我有addet那里-lm通过构建,现在我有另一个错误,但这是解决!谢谢 – Waypoint 2011-03-09 16:47:08

+0

@paxdiablo:以及[μClibc](https://bugs.gentoo.org/show_bug.cgi?id=549860)为csqrt的情况? – user2284570 2015-05-18 23:37:49

21

我想您已经导入文件math.h与#include <math.h>

所以,唯一的其他原因,我可以看到的是一个缺少链接信息。您必须将您的代码与-lm选项相关联。

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

+0

它不会生成,因为您的链接不正确,只需在您的building命令中添加'-lm'即可。 – krtek 2011-03-09 16:43:30

+0

对于csqrt(),[μClibc](https://bugs.gentoo.org/show_bug.cgi?id=549860)的情况? – user2284570 2015-05-18 23:39:24

0

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

1

只需在c源文件中添加#include <math.h>,最后在Makefile中添加-lm将适用于我。

gcc -pthread -o p3 p3.c -lm 
+0

对不起,include语句被堆栈溢出隐藏。我刚刚做了代码,现在它正在工作。 – 2017-07-12 21:53:32