代码之家  ›  专栏  ›  技术社区  ›  WedaPashi user968000

这是在线C编译器gcc-7.2.0的一个小故障吗?[副本]

  •  -2
  • WedaPashi user968000  · 技术社区  · 8 年前

    在名为 jdoodle ,我尝试了以下简单片段:

    #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认为它无效,并意外地将“未定义的引用错误”分配给有效的库函数?

    更新:我尝试了相同的代码片段 codechef online compiler 使用C-GCC6.3,它可以很好地编译并生成预期的输出。

    1 回复  |  直到 8 年前
        1
  •  1
  •   Basile Starynkevitch    8 年前

    这个 man page for ceil(3) 证明:

    你需要 #include <math.h>

    你应该

    链接到 -lm .

    您忘记将联机编译器配置为链接到 -lm公司 ; 也许你正在使用的那个并没有提供这样的选项。

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

    推荐文章