gcc and math.h
Tom 'Needs A Hat' Mitchell
mitch48 at sbcglobal.net
Mon Mar 22 07:16:43 UTC 2004
On Mon, Mar 22, 2004 at 09:28:24AM +0800, Didier Casse wrote:
> On 21/03/04, at 18:36 -0600, stucklenp <stucklenp at charter.net> wrote:
> >
> > I routinely program using C and compile with gcc. My problem is that I need
> > some math log functions--ln, log10, and log2--and these functions are not
> > included in math.h from what I can determine. Can anyone suggest how I can
> > get these functions?
>
> All the functions that you're saying are included. Have a look here for
> math.h fucntions:
>
> http://www.opengroup.org/onlinepubs/007908799/xsh/math.h.html
>
> Do a "man function" to find out more about the individual functions. e.g
> "man log".
>
> My guess is that you haven't linked your source code to the math
> library. (-lm option)
>
> i.e
>
> gcc -lm myfile.c -o myfile
Yes... -lm is needed by the link editor (ld).
$ cc t.c
/tmp/ccISAzDN.o(.text+0x23): In function `main':
: undefined reference to `log'
collect2: ld returned 1 exit status
and
$ cc t.c -lm
returns success and a.out does the expected.
$ a.out
log(10.0) is 2.302585
$ grep 2.302585 /usr/include/math.h
# define M_LN10 2.30258509299404568402 /* log_e 10 */
I wondered how one could discover this if it was unknown...
The "man log" command found the man page for log()/ EXP(3)
The 3 tells me it is in section three of the man pages.
Someone once told me that the "intro" man pages were worth reading and
full of nifty stuff. I tried "man 3 intro" and found a clue.
As I scanned down
(3M) These functions are contained in the arithmetic library libm.
They are used by the f77(1) FORTRAN compiler by default, but not
by the cc(1) C compiler, which needs the option -lm.
So for a "C" program -lm is the magic compile line addition.
And that is good to know because,
I really do not want to resort to the silly and brutal:
(for i in /usr/lib/*.so* # might need to do a find...
do
echo ================================
echo $i
nm $i | grep log$
echo ----------------------
done)| less
to find the symbol the hard way in a nasty long list of junk.
================================
/usr/lib/libm.so
0000b020 W clog
0000b020 t __clog
00007850 t __ieee754_log
00009fa0 W log <-----found it.
00009fa0 t __log
----------------------
I guess the intro man pages are worth a second/third look.
;-)
Summary:
Good question, the answer is not obvious if you don't know it.
--
T o m M i t c h e l l
/dev/null the ultimate in secure storage.
More information about the fedora-list
mailing list