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
.
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…