Possible Duplicate:
gcc: why the -lm flag is needed to link the math library?
Generally speaking, in order to use any of the math functions, apart from including the header file math.h
, you have to link with the linker option -lm. -l
here would mean the linker option to search of the specific library libm.o
.
Why does GCC does include this library by default? Is it because the library heavily uses a math-coprocessor and it requires to add the extra bit of code to initialize the floating point initialization (I may use the wrong terminology here)?
Note
I just reviewed all the answers mentioned in question gcc: why is the -lm flag needed to link the math library?. This doesn't makes much sense to me. There are three basic reasons attributed:
The standard libraries are guaranteed to be available. Linking other POSIX libraries like pthread explicitly makes sense, but why do we have to do an explicit link for a standard library? Even the historical reason is not very clear.
Why was libm separated from libc?
Why are we still inheriting these behaviors in the recent GCC compilers? What simplicity does it achieve? Here is what I tested, without libm and with libm. For the one without libm, I have written my own version of Pow().
Here is the example:
cd ~/Projects/GIPL6_2
$ ls -1 Test_*|xargs -I{} sh -c "echo {} && echo "-----------------" && cat {}"
Test_withlibm.c
-----------------
#include<stdio.h>
#include<math.h>
int main() {
int i=20;
double output1=pow(2.618033988749895,i);
return 0;
}
Test_withoutlibm.c
-----------------
#include<stdio.h>
#include<math.h>
double Pow(double _X, int _Y) {
double _Z = 1;
for (; _Y; _X *= _X) {
if (_Y & 1) _Z *= _X;
_Y >>= 1;
}
return _Z;
}
int main() {
int i=20;
double output1=Pow(2.618033988749895,i);
return 0;
}
$ gcc Test_withlibm.c -lm -o Main_withlibm.o
$ gcc Test_withoutlibm.c -o Main_withoutlibm.o
$ objdump -d Main_withoutlibm.o|wc -l
261
$ objdump -d Main_withlibm.o|wc -l
241