gcc在使用fmod()时出错
fmod的示例代码:gcc在使用fmod()时出错,c,gcc,ld,modulo,libm,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; } 我明白了 /tmp/ccztJO01.o:在函数“main”中: main.c:(.text+0x4d):对
#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;
}
我明白了
/tmp/ccztJO01.o:在函数“main”中:
main.c:(.text+0x4d):对“fmod”的未定义引用
collect2:ld返回了1个退出状态
然后我在谷歌找到了这个:
$ gcc -lm main.c -o main
我为什么要使用
-lm
,它到底是什么?从哪里可以获得更多关于gcc的详细信息?-lm
只是告诉它链接libm
,其中包含所有浮点数学例程,包括(这里毫不奇怪)fmod抱怨的不是编译器,而是链接器ld
。它无法在程序中找到例程fmod
。您必须告诉它使用-l
标志链接数学库libm
[更多]更多信息:.当我输入gcc-lm main.c-o main时,仍然会收到链接器错误。我需要编写gcc main.c-lm-o main。如果这对你有好处,那就有点奇怪了。我知道链接器会找到main.c中声明的符号(即double fmod(double,double)
),但只有在以后找到它的定义(即libm.a
)时才能解析它
长话短说,库必须(至少一次)“放在”使用它们的地方的右边。早在2010年,当有人问到这个问题时,大多数linux发行版配置GCC链接共享库,无论它们出现在链接序列中引用之前还是之后。有些人仍然这样做。很有趣。我添加了一个答案,因为我认为它可能对其他人研究这个错误有用。
$ gcc -lm main.c -o main