Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 无法在Linux—;对pow的未定义引用_C_Linux_Gcc - Fatal编程技术网

C 无法在Linux—;对pow的未定义引用

C 无法在Linux—;对pow的未定义引用,c,linux,gcc,C,Linux,Gcc,我正在Coursera上Arduino课程,需要编写一个程序列出前6个斐波诺契数。这是一个相当琐碎的任务,所以我决定走另一条路,用黄金分割法计算数字。但是,我无法在LinuxMint上使用GeanyIDE构建程序。代码编译时没有错误,但不会生成。它在Arduino上编译时也不会出错。但是如果我不能构建它,我就不能提交或测试它 #include <stdio.h> #include <math.h> double GoldenMeanA; double GoldenMea

我正在Coursera上Arduino课程,需要编写一个程序列出前6个斐波诺契数。这是一个相当琐碎的任务,所以我决定走另一条路,用黄金分割法计算数字。但是,我无法在LinuxMint上使用GeanyIDE构建程序。代码编译时没有错误,但不会生成。它在Arduino上编译时也不会出错。但是如果我不能构建它,我就不能提交或测试它

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

double GoldenMeanA;
double GoldenMeanB;
int i;
double x;


int main()
{
    printf ("the Fibonocci numbers are   ");
    for ( i = 1; i < 7 ; i++ )
    {   GoldenMeanA = pow(1.61, i);
        GoldenMeanB = pow(-.61, i);
        x = (GoldenMeanA) - (GoldenMeanB) / (sqrt (5));
        printf("%f", x);
    }
    return 0;
}

我不知道这意味着什么,但我认为
math.h
是一个内置的库。Geany难道不知道“pow”到底是什么吗?

你还没有链接到数学库。数学库不是标准库的一部分,默认情况下gcc链接标准库。因此,您需要自己将其与
-lm
链接

gcc -Wall -o fibass2 fibass2.c -lm 
链接器给出了您看到的错误,它找不到
pow()
函数的定义。include
math.h
仅提供必要的原型/声明。它不提供实际的库

我不知道这意味着什么,但我认为数学是一个内置的图书馆。杰尼难道不应该知道“战俘”到底是什么吗

math.h
不是一个库;它是一个头文件。非常非正式地,头文件让编译器知道函数和常量的声明是什么。有点像说“yo,compiler,
pow
是一个函数,它接受类型为double的两个参数并返回一个double”

编译器,实际上是解析器,需要这些信息来检查语句的语义正确性……特别是检查是否提供了适当数量的参数,以及类型是否正确

现在,编译器,实际上是链接器,需要找到您声明和使用的任何内容的定义。由于您没有提供定义(即函数的实现),链接器将抛出一个错误

提示:每当您看到“undefined reference”之类的错误时,您都忘记了实现所使用的函数,或者忘记了链接相应的库(如l3x所示)

注意:我一直在说“编译器,实际上是链接器”,因为大多数人把gcc称为编译器,但实际上它是一组程序,它们共同工作,将源代码转换为可执行文件(或库)。至少涉及以下项目:

  • 预处理器(在Linux系统上,这通常是
    cpp
    )。本部分介绍预处理器指令,如
    #include
    #define
    。您可以使用带有
    gcc
    -E
    参数查看预处理器的输出

  • 解析器(在Linux系统上,这通常是
    cc1
    ),这一部分负责检查程序的语义,并生成汇编语言输出。您可以使用gcc的
    -S
    参数查看此阶段的输出

  • 汇编程序(在Linux系统上,这通常是
    gas
    )。这可以将解析器的输出转换为目标代码。您可以使用gcc的
    -c
    参数查看此阶段的输出(这是第一个不是纯文本文件的输出)

  • 链接器(在Linux系统上,这通常是
    ld
    )。这将获取多个对象文件并将它们链接到一个可执行文件中。它还处理动态链接并设置可执行文件,以便在运行时链接库


  • 了解这些程序的功能以及错误类型(和原因)将使您在对生成进行故障排除时更加轻松。

    I3x提供的命令行是正确的。当我输入时,我没有在命令行上收到错误。然而,Geany仍然不会构建代码,并给出了相同的错误

    但我记得在Geany的菜单列表中,在“Build”下看到了一个叫做“setbuildcommands”的地方,所以我选择了它。我不知道大多数选项是什么,但第二个框标记为“build”,所以我将I3x中的命令粘贴到该框中并保存了它。沃拉。程序编译和构建时没有进一步的问题。一旦我可以建立和测试它,我发现程序有逻辑问题,我修复。以下是最终工作代码,希望以Olaf批准的方式形成:

    #include <stdio.h>
    #include <math.h>
    
    int main()
    {
        double GoldenMeanA;
        double GoldenMeanB;
        int i;
        int F;
        float x;
    
        printf ("The Fibonocci numbers are   ");
        for ( i = 1; i < 7 ; i++ )
        {  
            GoldenMeanA = pow(1.6180339887, i);
            GoldenMeanB = pow(-.6180339887, i);
            x = ((GoldenMeanA) - (GoldenMeanB)) / (sqrt (5));
            F=(int)(x+0.1);
            printf("%d  ", F); 
        }
        return 0;
    }
    
    #包括
    #包括
    int main()
    {
    重瓣黄花;
    双金合欢;
    int i;
    int F;
    浮动x;
    printf(“斐波诺契数为”);
    对于(i=1;i<7;i++)
    {  
    GoldenMeanA=pow(1.6180339887,i);
    GoldenMeanB=pow(-6180339887,i);
    x=((黄金平均值)-(黄金平均值))/(sqrt(5));
    F=(int)(x+0.1);
    printf(“%d”,F);
    }
    返回0;
    }
    

    我也为感谢我的导师而道歉。我只是在阅读说明中找到答案,我不应该这样做

    正确格式化代码。这是不可读的。很抱歉格式不好,但我所学的课程没有教我们任何关于格式的知识,我的课本也没有。我尽我所能使它可读。我知道Python格式化。我下次会用它,因为据我所知,C语言中没有格式化标准。。很抱歉我不熟悉堆栈溢出。C中有各种缩进标准。试试这个。没有一个能像Python一样——这是有充分理由的。不要尝试格式化C Python风格!有一种叫做搜索提供者的东西,它允许搜索诸如“C缩进样式”之类的短语。OK就可以了。我之所以没有做像Google那样明显的事情,是因为我被告知C没有格式化风格。的确,它没有Python那样的规范性,但事实上这是一个优点!这意味着您可以使用无限量的空格和返回来格式化您的代码,就像人类阅读一样
    #include <stdio.h>
    #include <math.h>
    
    int main()
    {
        double GoldenMeanA;
        double GoldenMeanB;
        int i;
        int F;
        float x;
    
        printf ("The Fibonocci numbers are   ");
        for ( i = 1; i < 7 ; i++ )
        {  
            GoldenMeanA = pow(1.6180339887, i);
            GoldenMeanB = pow(-.6180339887, i);
            x = ((GoldenMeanA) - (GoldenMeanB)) / (sqrt (5));
            F=(int)(x+0.1);
            printf("%d  ", F); 
        }
        return 0;
    }