Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why Am I Getting Link Errors When Calling Function in Math.h?

Tags:

math

gcc

linker

When attempting to call functions in math.h, I'm getting link errors like the following

undefined reference to sqrt

But I'm doing a #include <math.h>
I'm using gcc and compiling as follows:

gcc -Wall -D_GNU_SOURCE blah.c -o blah

Why can't the linker find the definition for sqrt?

like image 774
FreeMemory Avatar asked Sep 19 '08 16:09

FreeMemory


People also ask

How to link math library in gcc?

To link in these libraries, use -lname. For example, the math library is in the file /usr/lib/libm.so (and the static version of the library is in /usr/lib/libm. a). To link the math library into your program you include -lm on the gcc command line (as in the example above).

What is LIBM?

LIBM is the standard C library of basic mathematical functions, such as sin(x), cos(x), exp(x), etc. To include the LIBM functions, just add -lm on your link command line. The Intel compiler includes an optimized math library that contains optimized implementations of LIBM functions.

How do you use math h in gcc?

To compile C program with math. h library, you have to put -lm just after the compile command gcc number. c -o number, this command will tell to the compiler to execute program with math. h library.


3 Answers

Add -lm to the command when you call gcc:
gcc -Wall -D_GNU_SOURCE blah.c -o blah -lm

This will tell the linker to link with the math library. Including math.h will tell the compiler that the math functions like sqrt() exist, but they are defined in a separate library, which the linker needs to pack with your executable.

As FreeMemory pointed out the library is called libm.a . On Unix-like systems, the rule for naming libraries is lib[blah].a . Then if you want to link them to your executable you use -l[blah] .

like image 133
Dima Avatar answered Sep 24 '22 19:09

Dima


You need to link the math library explicitly. Add -lm to the flags you're passing to gcc so that the linker knows to link libm.a

like image 36
FreeMemory Avatar answered Sep 22 '22 19:09

FreeMemory


Append -lm to the end of the gcc command to link the math library:

gcc -Wall -D_GNU_SOURCE blah.c -o blah -lm

For things to be linked properly, the order of the compiler flags matters! Specifically, the -lm should be placed at the end of the line.

If you're wondering why the math.h library needs to be included at all when compiling in C, check out this explanation here.

like image 36
Billy Raseman Avatar answered Sep 26 '22 19:09

Billy Raseman