【问题标题】:Using pow() function throws undefined reference error in C使用 pow() 函数在 C 中引发未定义的引用错误
【发布时间】:2021-09-15 03:07:45
【问题描述】:

为什么以下代码在 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' 的未定义引用

我做错了什么?

【问题讨论】:

  • 一个完整的代码 sn-p 会很有帮助...
  • 你是否包含了 math.h?
  • 我包括 math.h,是的。第一个代码 sn-p 工作并输出预期的内容。另外两个给出“对‘pow’的未定义引用”。
  • 您是否通过向 gcc/g++ 提供 -lm 开关来链接数学库?
  • 在你的第三个代码 sn-p 中,双精度值后面应该有一个 .0。所以,double a = 2.0;,而不是double a = 2;

标签: c math.h


【解决方案1】:

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

printf("8\n");

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

gcc ... -lm ...

用其他编译器,应该是一样的:)
但请阅读文档

【讨论】:

  • 你是正确的! GCC 使用 MPFR。以下是一些信息:gcc.gnu.org/gcc-4.3/changes.html#mpfropts
  • MPFR!哇! :) 当我尝试完全相同的事情并且无法相信我所看到的时,我完全把我击倒了。
【解决方案2】:

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

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

【讨论】:

  • 如果您注意到,相同的答案发布的时间间隔
【解决方案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

【讨论】:

    【解决方案4】:

    对 `pow' 的未定义引用

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

    pow(x,y)
    where, x must be real and y must be a whole number
    

    【讨论】:

    • 我知道这是旧的,但要提一下,这是不正确的, pow() 需要两个双参数。 ;)
    猜你喜欢
    • 1970-01-01
    • 2022-05-03
    • 2022-11-02
    • 1970-01-01
    • 2017-12-08
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多