gcc在使用fmod()时出错

moh*_*hit 3 c gcc ld modulo libm

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;    
}
Run Code Online (Sandbox Code Playgroud)

编译:

$ gcc main.c -o main
Run Code Online (Sandbox Code Playgroud)

我明白了

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

main.c :(.text + 0x4d):对`fmod'的未定义引用

collect2:ld返回1退出状态

然后我在谷歌发现了这个:

$ gcc -lm main.c -o main
Run Code Online (Sandbox Code Playgroud)

我为什么要使用-lm,究竟是什么?从哪里可以获得有关gcc的更多信息?

Jer*_*fin 8

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


Nat*_*ell 7

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

长话短说,库必须放置(至少一次)在使用位置的“右侧”。

  • 早在 2010 年,当这个问题被问到时,大多数 Linux 发行版都将 GCC 配置为链接共享库,无论它们出现在链接序列中引用之前还是之后。有些人仍然这样做。 (3认同)

Nik*_*sov 5

抱怨的不是编译器,而是链接器。ld它无法在您的程序中找到例程fmodlibm你必须告诉它与带有标志的数学库链接-l

[更多]更多信息:GCC,GNU 编译器集合