无法在Linux上的Geany中构建简单的C程序 - 未定义的pow参考

时间:2016-01-09 19:51:49

标签: c linux gcc

我正在Coursera学习Arduino课程,并且需要编写一个程序来列出前6个Fibonocci数字。相反,这是一个微不足道的任务,所以我决定采用不同的路线并使用中庸计算数字。但是我无法在Linux Mint上使用Geany IDE构建程序。代码编译没有错误,但不会构建。它也可以在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;
}

我是C编程的新手。以下是Geany的错误:

gcc -Wall -o "fibass2" "fibass2.c" (in directory: /home/q/Desktop/Learn C)
/tmp/ccXlfYCE.o: In function `main':
fibass2.c:(.text+0x45): undefined reference to `pow'
fibass2.c:(.text+0x95): undefined reference to `pow'
collect2: error: ld returned 1 exit status
Compilation failed.

我不知道这意味着什么,但我认为math.h是一个内置库。不应该知道Geany知道什么是&#34; pow&#34;是

3 个答案:

答案 0 :(得分:2)

您尚未关联数学库。数学库不是标准库的一部分,默认情况下gcc链接。因此,您需要自己将其与-lm

联系起来
gcc -Wall -o fibass2 fibass2.c -lm 

您看到的错误是由链接器提供的,它无法找到pow()函数的定义。包括math.h仅提供必要的原型/声明。它不提供实际的库。

答案 1 :(得分:1)

  

我不知道这是什么意思,但我认为math.h是一个内置的库。不应该知道Geany知道什么是&#34; pow&#34;是

math.h不是图书馆;它是一个头文件。非正式地,头文件让编译器知道函数和常量的声明是什么。有点像说&#34;哟,编译器,pow是一个函数,它接受double类型的两个参数并返回一个double&#34;。

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

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

提示:任何时候你都会看到类似&#34;未定义的引用&#34;你忘了实现你使用的功能,或忘记链接相应的库(如l3x所示)。

N.B。我一直在说&#34;编译器,实际上是链接器&#34;因为大多数人将gcc称为编译器,但它实际上是一组程序,它们共同将源代码转换为可执行文件(或库)。至少涉及以下计划:

  1. 预处理器(在Linux系统上,通常为cpp)。这部分涉及预处理器指令,如#include#define。您可以使用-E gcc参数查看预处理器的输出。

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

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

  4. 链接器(在Linux系统上通常为ld)。这需要多个目标文件并将它们链接到一个可执行文件中。它还处理动态链接并设置可执行文件,以便可以在运行时链接库。

  5. 了解每个程序的功能以及错误类型(和原因)将使您在对构建进行故障排除时更加轻松。

答案 2 :(得分:0)

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

但是我记得在Geany的菜单列表中看到了一个更远的地方&#34; Build&#34;调用&#34;设置构建命令。&#34;所以我选择了那个。我不知道大多数选项是什么,但第二个框被标记为&#34; build&#34;所以我将I3x中的命令粘贴到该框中并保存。 WALLA。该程序编译和构建没有进一步的问题。一旦我可以构建和测试它,我发现该程序有我修复的逻辑问题。以下是希望以Olaf批准的方式编写的最终工作代码:

<application 
    android:name=".AnalyticsApplication"

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