You have compiled your code with references to the correct math.h header file, but when you attempted to link it, you forgot the option to include the math library. As a result, you can compile your .o object files, but not build your executable.
As Paul has already mentioned add “-lm” to link with the math library in the step where you are attempting to generate your executable.
In the comment, linuxD asks:
Why for
sin()in<math.h>, do we need-lmoption explicitly; but,
not forprintf()in<stdio.h>?
Because both these functions are implemented as part of the “Single UNIX Specification”. This history of this standard is interesting, and is known by many names (IEEE Std 1003.1, X/Open Portability Guide, POSIX, Spec 1170).
This standard, specifically separates out the “Standard C library” routines from the “Standard C Mathematical Library” routines (page 277). The pertinent passage is copied below:
Standard C Library
The Standard C library is automatically searched by
ccto resolve external references. This library supports all of the
interfaces of the Base System, as defined in Volume 1, except for the
Math Routines.Standard C Mathematical Library
This library supports
the Base System math routines, as defined in Volume 1. Theccoption
-lmis used to search this library.
The reasoning behind this separation was influenced by a number of factors:
- The UNIX wars led to increasing divergence from the original AT&T UNIX offering.
- The number of UNIX platforms added difficulty in developing software for the operating system.
- An attempt to define the lowest common denominator for software developers was launched, called 1988 POSIX.
- Software developers programmed against the POSIX standard to provide their software on “POSIX compliant systems” in order to reach more platforms.
- UNIX customers demanded “POSIX compliant” UNIX systems to run the software.
The pressures that fed into the decision to put -lm in a different library probably included, but are not limited to:
- It seems like a good way to keep the size of libc down, as many applications don’t use functions embedded in the math library.
- It provides flexibility in math library implementation, where some math libraries rely on larger embedded lookup tables while others may rely on smaller lookup tables (computing solutions).
- For truly size constrained applications, it permits reimplementations of the math library in a non-standard way (like pulling out just
sin()and putting it in a custom built library.
In any case, it is now part of the standard to not be automatically included as part of the C language, and that’s why you must add -lm.