使用fmod()时,gcc报错

9

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): 对 `fmod' 未定义的引用

collect2: ld 返回 1 退出状态

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

$ gcc -lm main.c -o main

我为什么要使用-lm,它到底是什么?我从哪里可以获取更详细的gcc信息呢?

3个回答

12

-lm 的含义是告诉编译器链接 libm 库,它包含了所有浮点数学例程,其中包括(不出意料的)fmod


5

编译器并没有报错,而是链接器 ld 报错了。它在程序中找不到函数 fmod。你需要使用 -l 标志告诉链接器链接数学库 libm

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


5
当我输入gcc -lm main.c -o main时,我仍然会得到链接错误。 我需要写成gcc main.c -lm -o main才能正常工作。如果对您来说以另一种方式工作,则有点奇怪。我了解链接器将查找在main.c中声明的符号(即double fmod(double,double)),但只有在稍后找到其定义时(即在libm.a中)才解析它。
简而言之,库必须被放置在至少一次使用它们的地方的“右边”。

3
回到2010年,当这个问题被提出时,大多数Linux发行版都配置了GCC以链接共享库,无论它们在链接序列中是在引用之前还是之后。而且现在仍然有一些发行版这样做。 - Mike Kinghan
有趣。我添加了一个答案,因为我认为它可能对其他查找此错误的人有用。 - Nathan Chappell

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接