9

假设我有以下代码片段:

int i; double value;
for(i = 0; i < CONSTANT; i++) {
  value = (double)pow(2, i);
}

尝试编译此代码会产生“未定义对‘pow’的引用”错误。

包含或排除math.h没有区别,因为无论如何它最终都会被包含在内。

提高2.0到硬编码的幂可以,但是如果我用包含i.

我究竟做错了什么?谢谢。

4

5 回答 5

16

这是一个非常有趣的行为,也是一个很好的学习例子。

要解决您的问题,请添加

-lm

到您的 gcc 命令行(前提是您使用的是 gcc)。这告诉编译器链接到数学库。

似乎正在发生的事情是,如果您正在使用

pow(2.0, 3);

编译器意识到这个表达式的计算结果是一个常量,并且仅仅进行了替换。

因此,不必调用库函数。

于 2010-12-13T16:38:40.407 回答
3

您需要与 -lm 链接以实际包含数学库。

它适用于硬编码值,因为编译器优化了 pow 调用。

于 2010-12-13T16:37:14.967 回答
3

您必须链接到数学库:

gcc program.c -lm

pow()原因是 GCC(和其他一些编译器)有一个用于文字常量的内置函数。因此,如果您pow()手动调用 2.0,编译器实际上会找出答案并将其替换为您。使用变量输入,编译器必须依赖于您必须链接的数学库。

于 2010-12-13T16:39:36.560 回答
1

的代码pow是数学库的一部分。您需要链接该库(除了默认链接的 C 库)。

为此,使用 gcc,-lm在编译器调用上指定

gcc ... -lm
于 2010-12-13T16:37:32.593 回答
0

http://www.cplusplus.com/reference/clibrary/cmath/pow/

在 C 中,只有采用两个双参数的版本存在此名称。其他重载仅在 C++ 中可用。

看起来你不能传递一个 int,所以只需做i一个 double 就可以了。

于 2010-12-13T16:37:18.503 回答