C 无法在Linux—;对pow的未定义引用
我正在Coursera上Arduino课程,需要编写一个程序列出前6个斐波诺契数。这是一个相当琐碎的任务,所以我决定走另一条路,用黄金分割法计算数字。但是,我无法在LinuxMint上使用GeanyIDE构建程序。代码编译时没有错误,但不会生成。它在Arduino上编译时也不会出错。但是如果我不能构建它,我就不能提交或测试它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
#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()
函数的定义。includemath.h
仅提供必要的原型/声明。它不提供实际的库
我不知道这意味着什么,但我认为数学是一个内置的图书馆。杰尼难道不应该知道“战俘”到底是什么吗
math.h
不是一个库;它是一个头文件。非常非正式地,头文件让编译器知道函数和常量的声明是什么。有点像说“yo,compiler,pow
是一个函数,它接受类型为double的两个参数并返回一个double”
编译器,实际上是解析器,需要这些信息来检查语句的语义正确性……特别是检查是否提供了适当数量的参数,以及类型是否正确
现在,编译器,实际上是链接器,需要找到您声明和使用的任何内容的定义。由于您没有提供定义(即函数的实现),链接器将抛出一个错误
提示:每当您看到“undefined reference”之类的错误时,您都忘记了实现所使用的函数,或者忘记了链接相应的库(如l3x所示)
注意:我一直在说“编译器,实际上是链接器”,因为大多数人把gcc称为编译器,但实际上它是一组程序,它们共同工作,将源代码转换为可执行文件(或库)。至少涉及以下项目:
cpp
)。本部分介绍预处理器指令,如#include
或#define
。您可以使用带有gcc
的-E
参数查看预处理器的输出cc1
),这一部分负责检查程序的语义,并生成汇编语言输出。您可以使用gcc的-S
参数查看此阶段的输出gas
)。这可以将解析器的输出转换为目标代码。您可以使用gcc的-c
参数查看此阶段的输出(这是第一个不是纯文本文件的输出)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;
}