c linker linker-errors libm

¿Por qué recibo un error de "referencia indefinida a sqrt" aunque incluyo el encabezado math.h?



linker linker-errors (6)

Agregar encabezado:

#include<math.h>

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

abs () - proporciona valores absolutos;

ejemplo, abs (-3) = 3

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

gcc <filename.extension> -lm

Soy nuevo en C y tengo este código:

#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

Me sale 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é?


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


Debes vincular el con la opción del enlazador -lm

Necesitas compilar como

gcc test.c -o test -lm

gcc (Not g ++) históricamente no incluiría por defecto las funciones matemáticas mientras se vincula. También se ha separado de libc en una biblioteca separada libm. Para vincularlas con estas funciones, debe avisar al vinculador que incluya la opción de biblioteca -l enlazador seguida del nombre de la biblioteca m tanto -lm .


Es probable que se trate de un error de enlazador. Agregue el -lm para especificar que desea establecer un vínculo con la biblioteca matemática C estándar ( libm ) que tiene la definición para esas funciones (el encabezado solo tiene la declaración para ellas, vale la pena buscar la diferencia).


La biblioteca matemática debe estar vinculada al construir el ejecutable. Cómo hacer esto varía según el entorno, pero en Linux / Unix, simplemente agregue -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 sufijo .a o .so .


Porque no le dijiste al vinculador sobre la ubicación de la biblioteca matemática . Compilar con gcc test.c -o test -lm