2011-04-19 38 views
1

为什么下面的代码给我一个错误未定义的引用sqrtC中的math.sqrt问题

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

int main(void) 
{ 
    double i = 25; 
    printf("\nSquare root of %d = %d",i,sqrt(i)); 
    return 0; 
} 

我已经包括文件math.h,我使用Debian.Can谁能告诉我什么错误。做我需要再次或东西安装我的图书馆?

+0

请包含完整且准确的错误消息。这将有助于表明它是编译器还是链接器问题。另外,打开math.h,看看sqrt是否在那里。 – abelenky 2011-04-19 05:16:19

+2

你使用了-lm吗? – Reno 2011-04-19 05:17:14

+2

更改修饰符 - sqrt返回double,并且您对这两者都使用了int修饰符。 – Bakudan 2011-04-19 05:22:52

回答

2

您使用的是GCC吗?任何“未定义的参考”意味着存在链接错误。换句话说,你没有正确地链接到一个包含它所抱怨的函数的库。在这种情况下,我相信你可以将-lm添加到链接器标志以链接到数学库。

7

使用命令行中的-lm标志编译它以链接到数学库。

3

Linux上的数学函数没有默认关联(因为它们相对较少使用)。您需要添加

-lm 

到您的编译器行以链接到数学库libm.so。

+0

是不是Linux的技术精明?那么数学库不应该是必不可少的,而不是很少使用? – 2011-04-19 05:20:01

+0

数学库默认不链接的原因不在于函数“很少使用”;它们实际上比libc的许多其他部分使用得更频繁。在这一点上,实际的原因主要是历史的好奇心。从本质上讲,用户历史上更愿意使用数学库的替代实现,而不是其他部分的libc。 – 2011-04-19 05:21:03

+0

@Stephen Canon:sqrt(),sin()和log()比malloc(),printf()或memcpy()更常用?我不这么认为。但是你是对的,使用替代实现的能力是数学函数不与libc混在一起的另一个原因。 (特别是在开始时,并非每台计算机都有* FPU,并且仿真库的性能和/或精度差异很大。)请注意,这不是语言标准的要求,而是Unix的实现细节。 – DevSolar 2011-04-19 12:26:18