尽管包括math.h,但在C中对pow()的未定义引用

Ian*_*ght 69 c

可能重复:
在C中使用pow()的问题
是'对'pow'的'未定义引用'

我对一个简单的单一课程有一点问题,这让我很困惑.

基本上,我要编写一个程序,除其他外,它计算给定半径的球体积.我以为我会使用该pow()函数而不是简单地使用r*r*r,对于额外的布朗尼点,但编译器一直给我以下错误:

未定义引用'pow'colle2:错误:ld返回1退出状态

我的代码如下所示:

#include <math.h>

#define PI 3.14159265 //defines the value of PI

/* Declare the functions */
double volumeFromRadius(double radius);

/* Calculate the volume of a sphere from a given radius */
double volumeFromRadius(double radius) {
    return (4.0/3.0) * PI * pow(radius,3.0f);
}
Run Code Online (Sandbox Code Playgroud)

我正在用命令编译 gcc -o sphere sphere.c

这在uni的Windows机器上的code :: blocks中编译并运行良好,但在家里的Fedora 17上,命令行编译器拒绝运行.任何想法将不胜感激!

祝福,伊恩

cod*_*ict 144

您需要链接数学库:

gcc -o sphere sphere.c -lm
Run Code Online (Sandbox Code Playgroud)

您看到的错误:error: ld returned 1 exit status来自链接器ld(组合目标文件的gcc的一部分),因为它无法找到pow定义函数的位置.

包括math.h引入各种功能的声明而不是它们的定义.def存在于数学库中libm.a.您需要将程序与此库链接,以便解析对pow()等函数的调用.

  • @ichigolas 很晚才得到答案,但为了记录:“-l”表示链接时要记住的二进制库。默认情况下,“-l”后面的任何内容都被解释为以“lib”开头并以“.a”结尾的文件名的一部分。因此“-lm”表示链接“libm.a” (7认同)
  • 这解决了我的问题。尽管如此,我有 2 个 Ubuntu 20.04 机器,并将 Code::Blocks 安装为 IDE。一种可以在不使用“-lm”的情况下正确编译源代码(包括数学函数),另一种则需要“-lm”。第二个盒子如何在没有“-lm”的情况下编译? (2认同)