在名为jdoodle的在线C编译器上,我尝试了以下简单的代码段:
#include<math.h>
#include<stdio.h>
int main(void)
{
double f = 1.2;
//printf("%f\n", ceil(f));
printf("%f\n", ceil(1.2));
return 0;
}
打印:
2.000000
这是我的预期。
但是当我将代码更改为:
时printf("%f\n", ceil(f));
//printf("%f\n", ceil(1.2));
编译器抱怨:
/tmp/ccv6kz5w.o: In function `main':
jdoodle.c:(.text+0x23): undefined reference to `ceil'
collect2: error: ld returned 1 exit status
man page for ceil()
中相当简单明了,它将double
变量作为唯一参数。
当我从7.2.0将编译器版本更改为5.3.0时,两个代码都已成功编译并生成了预期的输出。
为什么编译器的更新版本会抱怨呢?
如果编译器抱怨它是正确的,那么任何人都可以告诉我为什么ceil(f);
会成为一段有问题的代码,这样gcc-7.2.0就不会认为它有效了,令人惊讶地分配了一个未定义的引用错误&#39;一个有效的库函数?
更新:我尝试使用带有C-GCC6.3的codechef online compiler相同的代码段,它编译得很好并生成预期的输出。
答案 0 :(得分:1)
您需要
#include <math.h>
你应该
与
-lm
的关联。
您忘记配置在线编译器以链接-lm
;或许你正在使用的那个人不提供这样的选择。
我建议您在自己的计算机上进行编译。