Reputation: 1081
Sample code for 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;
}
Compiling:
$ gcc main.c -o main
I get
/tmp/ccztJO01.o: In function `main':
main.c:(.text+0x4d): undefined reference to `fmod'
collect2: ld returned 1 exit status
Then I found this in Google:
$ gcc -lm main.c -o main
Why should I use -lm
, what is it exactly? From where I can get more information about gcc in detail?
Upvotes: 10
Views: 16023
Reputation: 2436
When I input gcc -lm main.c -o main
I still get a linker error. I need to write gcc main.c -lm -o main
for it work right. If it's working for you the other way, that's a bit odd. I understand that the linker will find the symbol declared in main.c (i.e. double fmod(double,double)
), but only resolve it if it finds its definition later on (i.e. in libm.a
).
Long story short, the libraries must be placed (at least once) "to the right of" the place where they are used.
Upvotes: 7
Reputation: 84151
It's not the compiler, but the linker, ld
, that is complaining. It cannot find the routine fmod
in your program. You have to tell it to link with math library libm
with the -l
flag.
[Much] more info: GCC, the GNU Compiler Collection.
Upvotes: 5
Reputation: 490008
-lm
is simply telling it to link libm
, which contains all the floating point math routines, including (no surprise here) fmod
.
Upvotes: 13