【问题标题】:Undefined Reference error for power function in C [duplicate]C中幂函数的未定义参考错误[重复]
【发布时间】:2012-01-26 20:40:42
【问题描述】:

可能重复:
Problem using pow() in C
Undefined reference to pow' andfloor'

我使用的是 gcc 4.6.1。

代码 sn-p:

int main(void)
{

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

 return 0;
}

终端:

avinash@titanic:~/Desktop/DSF$ gcc power.c -o power
/tmp/ccTJ7vAH.o: In function `main':

power.c:(.text+0x25): undefined reference to `pow'
collect2: ld returned 1 exit status

如果我将 x 替换为 2,那么它将以预期的方式执行。 pow 函数不接受变量作为参数吗?

注意:我在源文件中包含了 stdio.h 和 math.h。

【问题讨论】:

  • 如果你有 pow(3,2) 编译器可以直接计算,而不必调用函数。
  • 如果您在源文件中包含 stdio.h 和 math.h,请在代码中向我们展示,而不是向我们展示不完整的代码,然后告诉我们缺少什么。
  • @KeithThompson- 对不起。但是“包含”一词似乎是粗体,而实际上并不适用于粗体。所以我删除了#include 行,但我已经提到我已经包含了两个库。

标签: c gcc pow


【解决方案1】:

您需要在数学库中添加-lm 命令行开关(-l... 表示“在__ 库中的链接”;m 是数学库) :

gcc power.c -lm -o power

【讨论】:

  • 或者更确切地说是gcc power.c -lm -o power。 lib 必须在源文件之后。
  • 这不是参数的正确顺序。见stackoverflow.com/questions/45135/linker-order-gcc
  • @ruakh- 没有变化。收到相同的错误消息。
  • @JamesMcLaughlin- 成功了!但是我可以知道为什么我需要添加那个开关(-lm)吗? 2)如果这一切都是为了链接库,那么为什么当我用任何常量号替换 x 时它会被执行?
  • @AvinashSonawane:这是因为 GCC 会“优化掉”对pow(3, 2) 的调用,将其替换为结果,因此它永远不会到达链接器。
【解决方案2】:

pow 函数是数学库的一部分。因此,您的编译器的调用应该如下:

gcc power.c -o power -lm

其中 -lm 是指示链接器与系统上的数学库进行链接的开关。

【讨论】:

  • @Daniel-成功了!但是我可以知道为什么我需要添加那个开关(-lm)吗? 2)如果这一切都是为了链接库,那么为什么当我用任何常量号替换 x 时它会被执行? 3)为什么在链接stdio.h等其他库的情况下我不必添加这个开关?
  • gcc 总是将源代码与标准 C 库隐式链接。显然,您正在使用 C 进行编程,因此您很可能无论如何都会使用该库,因此每次在命令行中添加一个额外的 -lc 会很奇怪。如果将“x”替换为常量,编译器(知道 pow 函数的作用)会将其转换为常量,并避免在运行时实际调用该函数。
  • @Daniel- 你的意思是 math.h 不是标准 C 库的一部分,如 stdio.h 吗?
猜你喜欢
  • 1970-01-01
  • 2012-11-22
  • 2014-07-25
  • 2018-03-02
  • 2022-01-11
  • 1970-01-01
  • 2016-06-11
  • 1970-01-01
相关资源
最近更新 更多