【问题标题】:Is this a glitch with online C compiler, gcc-7.2.0? [duplicate]这是在线 C 编译器 gcc-7.2.0 的故障吗? [复制]
【发布时间】:2018-06-15 14:01:38
【问题描述】:

在一个名为 jdoodle 的在线 C 编译器上,我尝试了下面这个简单的 sn-p:

#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 不认为它有效,令人惊讶地将“未定义的引用错误”分配给有效的库函数?

更新:我用 C-GCC6.3 尝试了与 codechef online compiler 相同的 sn-p,它编译良好并生成预期的输出。

【问题讨论】:

  • 编译时添加-lm。检查它是否存在于 jDoodle 的编译选项中
  • @Schwern:确实可能重复。但是我仍然有这个问题“为什么编译器的更新版本会抱怨它呢?”我可能不得不阅读这两个版本的 GCC 文档,而不是要求任何人为我这样做。还是谢谢你:)
  • 如果在线编译器在 Mac 上运行,-lm 将是无害的,但没有必要。不同系统之间存在差异。使用文字的调用在编译时被替换,因此在可执行文件中没有提及ceil()——并且链接代码没有问题,因为缺少-lm 库。
  • 编译器可以在编译时计算ceil(1.2)(因此不需要在运行时实际调用ceil,因此不需要与-lm链接)。但是对于ceil(f) 可能无法做到(例如,如果f 是运行时输入)。所以它需要-lm。一般来说,如果您使用数学库函数,链接它们是安全的 - 最坏的情况是它会被忽略且无害。

标签: c online-compilation gcc7


【解决方案1】:

man page for ceil(3) 文件表明:

你需要#include &lt;math.h&gt;

你应该这样做

链接到-lm

您忘记将在线编译器配置为与-lm 链接;也许您正在使用的那个不提供这样的选项。

我建议在您自己的计算机上编译。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-06
    • 2011-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-12
    • 2014-02-18
    • 2015-05-08
    相关资源
    最近更新 更多