这是在线 C 编译器 gcc-7.2.0 的故障吗?
Is this a glitch with online C compiler, gcc-7.2.0?
在一个名为 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 不认为它有效,令人惊讶地分配 'an undefined reference error'到有效的库函数?
更新:我用 codechef online compiler 和 C-GCC6.3 尝试了相同的片段,它编译正常并生成预期的输出。
man page for ceil(3) 文件表明:
you need to #include <math.h>
你应该
Link with -lm
.
您忘记将在线编译器配置为 link 和 -lm
;也许您正在使用的那个不提供这样的选项。
建议在自己的电脑上编译。
在一个名为 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 不认为它有效,令人惊讶地分配 'an undefined reference error'到有效的库函数?
更新:我用 codechef online compiler 和 C-GCC6.3 尝试了相同的片段,它编译正常并生成预期的输出。
man page for ceil(3) 文件表明:
you need to
#include <math.h>
你应该
Link with
-lm
.
您忘记将在线编译器配置为 link 和 -lm
;也许您正在使用的那个不提供这样的选项。
建议在自己的电脑上编译。