EmbDev.net

Forum: ARM programming with GCC/GNU tools Newbe : Understanding -lm math library linkage


von Joe G. (joeg)


Rate this post
useful
not useful
Hi All,

To use math.h    where do I put the  -lm in a WinArm make file.

How does Make and the compiler know where math.h lives?

Where can I get the descriptions of the math.h library functions?


Thanks in advance.

Joe

von Clifford S. (clifford)


Rate this post
useful
not useful
I apologise if the following tells you a lot you already know, but I
sense some confusion in your question, so I'm pretty much going to give
you the whole story.

First be clear that math.h is NOT the math library. It is merely the
header file that contains prototype function declarations for the code
in the math library. The math library itself is the file libm.a.

Now the compiler needs the header file so that it knows the signature of
the math functions. When the compiler encounters a math function, it
checks that the signature matches the call, then inserts an unresolved
link in the object code - a kind of place-holder for the actual function
call at an as yet unknown address (note I am referring to functions, but
it is similar for global data items as well). The linker later takes all
the object modules from separately compiled sources and resolves
inter-module links between them, then to resolve any remaining links it
searches the libraries in they order they are listed on the linker
command line.

So to answer your questions:

> To use math.h    where do I put the  -lm in a WinArm make file.
-lm is a linker option. The option is actually -l<libraryname>, the
library is libm.a but the GNU linker will insert the lib prefix and .a
extension automatically. Now where in your makefile to place the option
will depend entirely on how the makefile is constructed - makefiles can
be as complex and infinitely varied as the code they build, however
conventionally a macro LDFLAGS is defined for linker options.
Alternatively find how and where ld (the linker) is invoked in the
makefile, and place it there or in whatever appropriate macro is used
there.

> How does Make and the compiler know where math.h lives?
The compiler searches for header files in a number of ways. Compiler
options of the form -I<path> specify paths that will be searched for
header files. These paths are searched in the order listed on the
command line. In GCC, include file paths can also be specified by the
following environment variables:

CPATH
C_INCLUDE_PATH
CPLUS_INCLUDE_PATH

each path being separated by a semi-colon on Windows, and a colon on
most other platforms. If the file is included using "file" rather than
<file> the compiler will look in the sourcefiles directory first.
Finally it is possible to specify the path explicitly, either direct or
relative, within the #include directive itself.

A typical makefile will have a macro that specifies the -I paths.

The linker has a -L<path> option which serves the same purpose as the
compiler's -I<path> but for library file searches. Similarly there is an
environment variable "LIBRARY_PATH".

Note that other compilers may use different options and environment
variables t0 do the same thing. Using environment variables is not a
good idea for cross-compilers since it is likely to conflict with any
native compiler you may be using.

> Where can I get the descriptions of the math.h library functions?
It is a C standard library - the references are numerous. The libm
manual for the Newlib library is provided with WinARM in the documents
folder, or download from: ftp://sources.redhat.com/pub/newlib/index.html
Other sources include:
http://www.cplusplus.com/reference/clibrary/cmath/
http://www.cppreference.com/stdmath/index.html

Clifford


Clifford

von Joe G. (joeg)


Rate this post
useful
not useful
Thanks for the detailed answer Clifford!

Joe

Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
No account? Register here.