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`-lm`

option explicitly; but,

not for`printf()`

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

`cc`

to 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. The`cc`

option

`-lm`

is 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`

.