2012-05-02 25 views
62

soy muy nuevo en C y tengo este código:¿Por qué aparece el error "referencia no definida a sqrt" aunque incluyo el encabezado math.h?

#include <stdio.h> 
#include <math.h> 
int main(void) 
{ 
    double x = 0.5; 
    double result = sqrt(x); 
    printf("The square root of %lf is %lf\n", x, result); 
    return 0; 
} 

Pero cuando compilo esto con:

gcc test.c -o test 

Puedo obtener un error como este:

/tmp/cc58XvyX.o: In function `main': 
test.c:(.text+0x2f): undefined reference to `sqrt' 
collect2: ld returned 1 exit status 

¿Por qué pasó esto? ¿sqrt() no está en el archivo de encabezado math.h? Obtengo el mismo error con cosh y otras funciones trigonométricas. ¿Por qué?

+1

Y aquí hay algunas especulaciones sobre por qué 'libm' no está vinculado por defecto a pesar de que contiene parte de la biblioteca estándar: http://stackoverflow.com/questions/1033898/why-do-you-have- to-link-the-math-library-in-c –

+0

Es un duplicado de este: http://stackoverflow.com/q/5248919/694576 – alk

Respuesta

102

La biblioteca matemática debe estar vinculada al crear el archivo ejecutable. La forma de hacerlo varía según el medio ambiente, pero en Linux/Unix, sólo tiene que añadir -lm al comando:

gcc test.c -o test -lm 

La biblioteca matemática se llama libm.so, y la opción de comando -l asume un prefijo lib y .a o .so sufijo.

17

es necesario enlazar con la opción del enlazador -lm

Se necesita compilar como

gcc test.c -o test -lm 

gcc (No g ++) históricamente no se incluyen de forma predeterminada las funciones matemáticas, mientras que la vinculación. También se ha separado de libc en una biblioteca separada libm. Para enlazar con estas funciones, debe avisarle al enlazador que incluya la opción del enlazador de la biblioteca -l seguida del nombre de la biblioteca m, por lo tanto, -lm.

7

Es probable que se trate de un error de enlazador. Añadir el interruptor -lm para especificar que desea enlazar con la librería C estándar de matemáticas (libm) que tiene la definición de las funciones (la cabecera solo tiene la declaraciónpara ellos -. Vale la pena analizar la diferencia)

4

Porque no le dijo al vinculador sobre la ubicación de math library. Compilar con gcc prueba test.c -o -lm

1

Añadir cabecera:

#include<math.h>

Nota: El uso abs(), a veces en el momento de la evaluación sqrt() puede tomar valores negativos que dejar a error de dominio.

abs() - proporciona valores absolutos;

ejemplo, ABS (-3) = 3

Incluir -lm al final de su comando durante el tiempo de compilación:

gcc <filename.extension> -lm

3

debe vincular el archivo de cabecera math.h con su código.Puede hacer esto escribiendo -lm después de su comando.

Cuestiones relacionadas