Ha compilado el código con referencias al archivo de cabecera math.h correcta, pero cuando se ha intentado vincularlo, se le olvidó la opción para incluir la biblioteca matemática. Como resultado, puede compilar sus archivos de objeto .o, pero no construir su ejecutable.
Como Paul ya ha mencionado, agregue "-lm
" para vincular con la biblioteca de matemáticas en el paso donde está intentando generar su ejecutable.
En el comment, linuxD pregunta:
Por qué para sin()
en <math.h>
, qué necesitamos -lm
opción explícita; pero, no para printf()
en <stdio.h>
?
Porque estas dos funciones se implementan como parte de la "Especificación única UNIX". Este historial de este estándar es interesante y se lo conoce por muchos nombres (IEEE Std 1003.1, X/Open Portability Guide, POSIX, Spec 1170).
Esta norma, specifically separates out the "Standard C library" routines from the "Standard C Mathematical Library" routines (page 277). El pasaje pertinente se copia a continuación:
biblioteca estándar de C
la biblioteca estándar de C se busca automáticamente por cc
para resolver referencias externas. Esta biblioteca es compatible con todas las interfaces del Sistema base, tal como se define en el Volumen 1, a excepción de las Rutinas de Matemáticas .
biblioteca estándar de C Matemática
Esta biblioteca es compatible con las rutinas matemáticas sistema base, como se define en el Volumen 1. La opción cc
-lm
se utiliza para buscar esta biblioteca.
El razonamiento detrás de esta separación fue influenciado por una serie de factores:
- El UNIX wars llevado a una creciente divergencia entre el original en & oferta T UNIX.
- El número de plataformas UNIX agregó dificultad en el desarrollo de software para el sistema operativo.
- Se lanzó un intento de definir el mínimo común denominador para los desarrolladores de software, called 1988 POSIX.
- Desarrolladores de software programados según el estándar POSIX para proporcionar su software en "sistemas compatibles con POSIX" para alcanzar más plataformas.
- Los clientes de UNIX exigieron sistemas UNIX "compatibles con POSIX" para ejecutar el software.
Las presiones que se alimentaban en la decisión de poner -lm
en una biblioteca diferente, probablemente, se incluye, pero no se limitan a:
- Parece una buena manera de mantener el tamaño de libc hacia abajo, como muchas aplicaciones no usan funciones integradas en la biblioteca matemática.
- Proporciona flexibilidad en la implementación de la biblioteca matemática, donde algunas bibliotecas matemáticas se basan en tablas de búsqueda integradas más grandes, mientras que otras pueden confiar en tablas de búsqueda más pequeñas (soluciones informáticas).
- Para aplicaciones realmente el tamaño limitados, permite reimplementaciones de la biblioteca matemática de una forma no estándar (como tirar hacia fuera apenas
sin()
y ponerlo en una biblioteca hecha a la medida.
En cualquier caso, es ahora parte del estándar para que no se incluya automáticamente como parte del lenguaje C, y es por eso que debe agregar -lm
.
Creo que [esto podría ser un duplicado] (http://stackoverflow.com/q/4188409/300805) – peoro
@ peoro, No me sorprendería. Esta es una biblioteca "olvidada" muy común. –