【问题标题】:gcc gives error while using fmod()gcc 在使用 fmod() 时出错
【发布时间】:2011-03-13 16:33:05
【问题描述】:

fmod 的示例代码:

#include <stdio.h>    
#include <math.h>

int main(void)   
{    
  double x = 0.14527, y = 3.14159;   
  printf("fmod(x, y) = %.6lf\n", fmod(x, y));    
  return 0;    
}

编译:

$ gcc main.c -o main

我明白了

/tmp/ccztJO01.o:在函数'main'中:

main.c:(.text+0x4d): undefined reference to `fmod'

collect2: ld 返回 1 个退出状态

然后我在谷歌上找到了这个:

$ gcc -lm main.c -o main

我为什么要使用-lm,它到底是什么?从哪里可以得到更多关于 gcc 的详细信息?

【问题讨论】:

    标签: c gcc ld modulo libm


    【解决方案1】:

    -lm 只是告诉它链接libm,其中包含所有浮点数学例程,包括(这里不奇怪)fmod

    【讨论】:

      【解决方案2】:

      抱怨的不是编译器,而是链接器 ld。它在您的程序中找不到例程fmod。您必须告诉它使用 -l 标志与数学库 libm 链接。

      [更多] 更多信息:GCC, the GNU Compiler Collection

      【讨论】:

        【解决方案3】:

        当我输入gcc -lm main.c -o main 时,我仍然收到链接器错误。我需要写gcc main.c -lm -o main 才能正常工作。如果它以另一种方式为您工作,那有点奇怪。我知道链接器会找到在 main.c 中声明的符号(即double fmod(double,double)),但只有在稍后找到它的定义时才解决它(即在libm.a 中)。

        长话短说,图书馆必须(至少一次)放置在使用它们的地方的“右侧”。

        【讨论】:

        • 早在 2010 年,当被问到这个问题时,大多数 linux 发行版都将 GCC 配置为链接共享库,无论它们出现在链接序列中引用之前还是之后。有些人仍然这样做。
        • 有趣。我添加了一个答案,因为我认为它可能对其他人调查此错误有用。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-11
        • 1970-01-01
        • 2021-03-28
        • 1970-01-01
        • 2012-04-05
        • 2023-04-07
        • 1970-01-01
        相关资源
        最近更新 更多