Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

gcc gives error while using fmod()

Tags:

c

gcc

modulo

ld

libm

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?

like image 758
mohit Avatar asked Jul 09 '10 03:07

mohit


3 Answers

-lm is simply telling it to link libm, which contains all the floating point math routines, including (no surprise here) fmod.

like image 165
Jerry Coffin Avatar answered Sep 30 '22 09:09

Jerry Coffin


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.

like image 43
Nathan Chappell Avatar answered Sep 30 '22 08:09

Nathan Chappell


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.

like image 24
Nikolai Fetissov Avatar answered Sep 30 '22 07:09

Nikolai Fetissov