tags:

views:

480

answers:

2

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?

+2  A: 

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

FreeMemory
You mean libm.a :)
Dima
You know, you can fix it, right? :) You can always edit your answers and questions.
Dima
+3  A: 

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] .

Dima
Actually, if you do that on a modern Linux system, you will end up linking to libm.so, which is the dynamic library equivalent of libm.a.
CesarB