Duplicar posible:
gcc: why the -lm flag is needed to link the math library?¿Por qué necesita una opción explícita compilador `-lm`
En términos generales, con el fin de utilizar cualquiera de las funciones matemáticas además de incluir la cabecera archivo math.h
tiene que vincular con la opción del vinculador -lm. -l
aquí significaría la opción del vinculador para buscar en la biblioteca específica libm.o
.
Mi pregunta es
Por qué GCC no incluye esta biblioteca por defecto? ¿Se debe a que la biblioteca utiliza en gran medida el coprocesador matemático y requiere agregar el bit adicional de código para inicializar la inicialización de punto flotante (aquí puedo usar la terminología equivocada)?
Nota
Acabo de revisar todas las respuestas mencionadas en el enlace http://stackoverflow.com. Esto no tiene mucho sentido para mí. Hay tres razones básicas atribuidas
- Se garantiza que las bibliotecas estándar estarán disponibles. Vincular explícitamente otras bibliotecas posix como pthread tiene sentido, pero ¿por qué tenemos que hacer un enlace explícito para una biblioteca estándar? Incluso la razón histórica no es muy clara.
- ¿Por qué libm se separó de la libc?
- ¿Por qué seguimos heredando estos comportamientos en los recientes compiladores de gcc? ¿Qué simplicidad logra? Esto es lo que probé, sin libm y con libm. El Uno sin libm, he escrito mi propia versión de Pow
Aquí está el ejemplo
[email protected]:~/Projects/GIPL6_2$ ls -1 Test_*|xargs -I{} sh -c "echo {} && echo "-----------------" && cat {}"
Test_withlibm.c
-----------------
#include<stdio.h>
#include<math.h>
int main() {
int i=20;
double output1=pow(2.618033988749895,i);
return 0;
}
Test_withoutlibm.c
-----------------
#include<stdio.h>
#include<math.h>
double Pow(double _X, int _Y) {
double _Z = 1;
for (; _Y; _X *= _X) {
if (_Y & 1) _Z *= _X;
_Y >>= 1;
}
return _Z;
}
int main() {
int i=20;
double output1=Pow(2.618033988749895,i);
return 0;
}
[email protected]:~/Projects/GIPL6_2$ gcc Test_withlibm.c -lm -o Main_withlibm.o
[email protected]:~/Projects/GIPL6_2$ gcc Test_withoutlibm.c -o Main_withoutlibm.o
[email protected]:~/Projects/GIPL6_2$ objdump -d Main_withoutlibm.o|wc -l
261
[email protected]:~/Projects/GIPL6_2$ objdump -d Main_withlibm.o|wc -l
241
Motivos históricos, supongo. El enlazador debe poder fácilmente no unir funciones que no se usan. MSVC tampoco necesita una libma para que pueda usar las funciones matemáticas. – Joey
No lo necesita con C++. – Mat