41

为什么以下代码在 C 中有效:

int res = pow(2, 3);
printf("%d\n", res);

而另一个没有?

int a = 2;
int b = 3;

int res = pow(a, b);
printf("%d\n", res);

即使我尝试

double a = 2;
double b = 3;

double res = pow(a, b);
printf("%f\n", res);

我得到一个

未定义对“pow”的引用

我究竟做错了什么?

4

4 回答 4

64

当它起作用时,这是因为计算是由编译器本身完成的(并且包含在二进制文件中,就像你写出来一样)

printf("8\n");

当它不起作用时,是因为该pow函数包含在数学库中,并且默认情况下数学库未与您的二进制文件链接。
要链接数学库,如果您的编译器是 gcc,请使用

gcc ... -lm ...

与其他编译器,应该是相同的:)
但阅读文档

于 2010-11-13T18:39:48.957 回答
17

undefined reference to 'pow'听起来像是链接器错误。您没有在数学库中进行链接,即使您pow通过包含<math.h>.

使用 gcc,使用-lm命令行参数链接到数学库。

于 2010-11-13T18:40:11.423 回答
3

像这样使用

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

int main(void)
{
  for(int i = 1; i < 5; i++)
     printf("pow(3.2, %d) = %lf\n", i, pow(3.2, i));  
  return 0;
}

输出:

pow(3.2, 1) = 3.200000

于 2010-11-13T18:40:39.957 回答
-6

未定义对“pow”的引用

因为任何数的幂必须有一个整数值作为幂

pow(x,y)
where, x must be real and y must be a whole number
于 2010-11-13T18:52:55.290 回答